JVM【面试题】2024最新

文章目录

什么是JVM

jvm就是java虚拟机,他是java跨平台的基石,并且不仅仅是java可以使用jvm虚拟机,只要是在jvm虚拟机上面跑的程序都可以被jvm编译成2进制文件

Jvm的组成

类加载机器:负责从文件系统、网络或其他来源加载 Class 文件,将 Class 文件中的二进制数据读入到内存当中。

内存:JVM 在执行 Java 程序时,需要在内存中分配空间来处理各种数据,这些内存区域主要包括方法区、堆、栈、程序计数器和本地方法栈。

执行引擎:执行引擎是 JVM 的心脏,负责执行字节码。它包括一个虚拟处理器,还包括即时编译器(JIT Compiler)和垃圾回收器(Garbage Collector)。

说一下jvm的内存区域

jvm内存区域也叫jvm运行的数据区,按照Java的规范可以分成:

  • 程序计数器:当前线程所执行的字节码行号指示器
  • 虚拟机栈:当线程执行一个方法时,会创建一个对应的栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,然后栈帧会被压入栈中。当方法执行完毕后,栈帧会从栈中移除。
  • 本地方法栈:在本地方法栈中,主要存放了 native 方法的局部变量、动态链接和方法出口等信息。当一个 Java 程序调用一个 native 方法时,JVM 会切换到本地方法栈来执行这个方法。
  • 堆:堆(heap)是 JVM 中最大的一块内存区域,被所有线程共享,在 JVM 启动时创建,主要用来存储对象的。并且Java 中"几乎"所有的对象都会在堆中分配,堆也是垃圾收集器管理的目标区域,因此一些资料中也会把 Java 堆称作"GC 堆"(Garbage Collected Heap)。
  • 本地方法区:不经常问

堆和栈的区别

1.栈内存存储的是局部变量而堆内存存储的是实体;

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

对象创建的过程

当我们使用 new 关键字创建一个对象的时候,JVM 首先会检查 new 指令的参数是否能在常量池中定位到一个类的符号引用,然后检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就先执行相应的类加载过程。

如果已经加载,JVM 会为新生对象分配内存,内存分配完成之后,JVM 将分配到的内存空间初始化为零值(成员变量,数值类型是 0,布尔类型是 false,对象类型是 null),接下来设置对象头,对象头里包含了对象是哪个类的实例、对象的哈希码、对象的 GC 分代年龄等信息。

最后,JVM 会执行构造方法(),将成员变量赋值为预期的值,这样一个对象就创建完成了。

对象销毁的过程

对象创建完成后,就可以通过引用来访问对象的方法和属性,当对象不再被任何引用指向时,对象就会变成垃圾。

垃圾收集器会通过可达性分析算法判断对象是否存活,如果对象不可达,就会被回收。

垃圾收集器会通过标记清除、标记复制、标记整理等算法来回收内存,将对象占用的内存空间释放出来。

内存泄漏和内存溢出

内存泄漏:在使用过内存的某一块区域后,没有对那个区域进行内存释放,随着时间的推移,内存越来越小,这样就发生了内存泄漏

内存溢出:程序在请求内存时没有足够大的内存满足要求,就发生内存溢出。

对象的引用方式

强、软、弱、虚引用

Java堆内存分区

  1. 新生代(Young Generation):
    • Eden区(Eden Space):这是对象最初被分配的地方。大多数对象在被创建时都会被分配到Eden区。
    • 幸存者区(Survivor Space):在新生代中有两个幸存者区,通常称为Survivor Space或者S0和S1。这些区域用来存储从Eden区复制过来的存活对象。
  2. 老年代(Old Generation):
    • 老年代(Tenured or Old Generation):这是存放长期存活的对象的区域。当对象在新生代经过多次垃圾回收后仍然存活,它们会被移到老年代。
  3. 永久代/元空间(PermGen/Metaspace):
    • 永久代(Permanent Generation):在旧版的JVM中使用,用来存放JVM加载的类信息、常量池、静态变量等。
    • 元空间(Metaspace):在较新的JVM中取代了永久代。元空间使用本地内存来存放类的元数据,因此不再有永久代的大小限制,而是受本地内存的限制。

新生代的垃圾回收算法

  1. 复制算法(Copying Algorithm):
    • 新生代通常使用复制算法来实现垃圾回收。这种算法将堆内存划分为两个相等的区域(通常称为Eden空间和两个Survivor空间),其中Eden空间用于分配新对象。当Eden空间填满时,触发Minor GC(新生代GC)。
    • Minor GC 发生时,存活的对象会被复制到其中一个Survivor空间中,而不是被标记并清除。
  2. 标记-复制算法(Mark-Compact Algorithm):
    • 有时候,复制算法会与标记-复制算法结合使用。这种算法在执行Minor GC时,首先使用标记过程标记所有存活对象,然后将它们复制到另一个区域,最后清理原始区域中的所有对象。

对象什么时候去往老生代

当对象在新生代经过多次垃圾回收后仍然存活,它们会被移到老年代。

垃圾回收机制

垃圾回收机制(GC)就是对内存堆里面死亡或者不经常使用的对象进行回收和清除

JVM在进行GC之前会通过可达性算法判断是否为垃圾

finalize()方法

在进行GC之前JVM会对所有的方法进行可达性算法,如果不可达就进行标记,下一次就进行回收(这就是标记-回收算法),而finalize就是,如果该对象在被JVM执行可达性算法后已经被标记了,但是他引用了finalize()方法,那么他就不会被回收。(GC相当于问斩,而finalize相当于刀下留人)

垃圾搜集器的选择

  • Serial :如果应用程序有一个很小的内存空间(大约 100 MB)亦或它在没有停顿时间要求的单线程处理器上运行。
  • Parallel:如果优先考虑应用程序的峰值性能,并且没有时间要求要求,或者可以接受 1 秒或更长的停顿时间。
  • CMS/G1:如果响应时间比吞吐量优先级高,或者垃圾收集暂停必须保持在大约 1 秒以内。
  • ZGC:如果响应时间是高优先级的,或者堆空间比较大。

双亲委派模型

当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,依次递归,直到最顶层的类加载器,如果父类加载器无法完成加载请求,子类加载器才会尝试自己去加载。

相关推荐
guangzhi06332 分钟前
JVM程序计数器
jvm
guangzhi06336 分钟前
JAVA执行引擎详细介绍
java·jvm
解孔明38 分钟前
IDEA2023.1添加java虚拟机启动参数,打开断言
java·开发语言
关关不烦恼41 分钟前
【Java数据结构】二叉树
java·开发语言·数据结构
苹果酱056741 分钟前
使用 React Testing Library 测试自定义 React Hooks
java·开发语言·spring boot·后端·中间件
好奇的菜鸟1 小时前
Java技术体系:深入理解JDK与JRE及其产品线
java·开发语言
api771 小时前
1688商品详情API返回值中的售后保障与服务信息
java·服务器·前端·javascript·python·spring·pygame
疑惑的杰瑞1 小时前
[乱码]确保命令行窗口与主流集成开发环境(IDE)统一采用UTF-8编码,以规避乱码问题
java·c++·vscode·python·eclipse·sublime text·visual studio
自身就是太阳1 小时前
深入理解 Spring 事务管理及其配置
java·开发语言·数据库·spring
喵手1 小时前
Java零基础-多态详解
java·开发语言·python