jvm面试题

发布时间:2024年01月12日

jvm面试题

JVM内存模型中不同区域的作用和功能

在 Java 虚拟机(JVM)的内存模型中,不同的区域具有不同的作用和功能,包括:

  • 程序计数器(Program Counter):是一块较小的内存空间,用于保存当前线程执行的字节码指令的地址。每个线程都有自己独立的程序计数器,用于指示下一条要执行的指令。
  • 栈(Stack):是一种线性的数据结构,用于支持方法的调用和返回。每当一个方法被调用时,会创建一个栈帧,栈帧中包含了方法的局部变量、操作数栈和返回地址等信息。栈帧按照后进先出的原则进行操作。
  • 本地方法栈(Native Method Stack):与栈类似,用于支持本地方法(用 native 关键字修饰的方法)的调用和返回。
  • 堆(Heap):是 JVM 中用于存储对象实例的区域。对象的创建和销毁都在堆上进行。堆可以分为年轻代(包括 Eden 区和 Survivor 区)和老年代。垃圾回收主要在堆上进行,以释放不再使用的对象所占用的内存空间。
  • 方法区(Method Area):也称为元空间(Metaspace),用于存储类的元数据、常量池、静态变量和方法代码。它是线程共享的。
  • 运行时常量池(Runtime Constant Pool):是方法区的一部分,用于存储常量、类和接口的全限定名以及字段和方法的符号引用。
  • 这些区域协同工作,为 Java 程序的执行提供了内存管理和运行环境。了解 JVM 内存模型的不同区域对于理解 Java 程序的性能优化、内存管理和调试都非常重要。
垃圾回收算法

在 Java 虚拟机(JVM)的堆内存中,垃圾回收算法用于回收不再使用的对象所占用的内存空间。常见的垃圾回收算法包括:

  1. 标记-清除算法(Mark-and-Sweep):该算法分为两个阶段。首先,标记阶段会遍历堆中的对象,并标记存活的对象。然后,在清除阶段,未被标记的对象将被视为垃圾并被回收。
  2. 复制算法(Copying):将堆分成两个区域,一个为活动区,另一个为空闲区。在垃圾回收时,将存活的对象复制到空闲区,然后一次性清空活动区.
  3. 标记-整理算法(Mark-and-Compact):结合了标记-清除算法和复制算法的思想。在标记阶段标记存活对象后,将存活对象移动到堆的一端,然后清理边界以外的空间。
  4. 分代收集算法(Generational Collection):根据对象的生命周期将堆划分为不同的代,通常是年轻代和老年代。垃圾回收算法在不同代中采用不同的策略。年轻代通常使用复制算法,因为对象的存活率较低。而老年代通常使用标记-整理算法或标记-清除算法,因为对象的存活率较高。
  5. 垃圾回收算法的选择和实现会影响到程序的性能和内存效率。Java 虚拟机通常会根据不同的场景和需求选择适合的垃圾回收算法,并且可以根据配置进行调整以满足特定的应用要求。
JVM中年轻代如何向老年代转换

在JVM中,年轻代向老年代转换通常是在minor GC过程中发生的。具体来说,年轻代分为Eden区、SurvivorFrom区和SurvivorTo区,当Eden区内存不够时会触发minorGC。在minorGC开始时,对象只会存在于Eden区和SurvivorFrom区,SurvivorTo区是空的。

在minorGC操作后,Eden区中仍然存活的对象(判断标准是被引用了,通过GC root进行可达性判断)会被移到SurvivorTo区。而在SurvivorFrom区中,对象在Survivor区中每熬过一次minorGC,年龄就会+1岁。当年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认是15)的对象会被移动到老年代中,否则对象会被复制到“To”区。

经过这次GC后,Eden区和From区已经被清空。“From”区和“To”区互换角色,原Survivor To成为下一次GC时的Survivor From区,总之,每次GC后都会保证Survivor To区是空的。

文章来源:https://blog.csdn.net/qq_37924905/article/details/135562710
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。