Java 虚拟机面试题, 什么条件会触发 Java 的 young GC?
Java 虚拟机面试题, 什么条件会触发 Java 的 young GC?
QA
Step 1
Q:: 什么是Java虚拟机?它的主要作用是什么?
A:: Java虚拟机(JVM)是一种能够执行Java字节码的引擎。JVM将Java编译器生成的字节码转换为机器代码,并通过不同的平台上实际操作系统的指令集执行这些机器代码。它的主要作用是实现Java的跨平台特性,使得Java代码可以在不同的操作系统上运行而无需修改。
Step 2
Q:: 什么条件会触发Java的Young GC?
A:: Young GC(Minor GC)会在以下条件下触发:1)当Eden区被填满时,JVM会触发Young GC,将存活的对象移动到Survivor区,或直接晋升到老年代。2
)当应用程序频繁分配大量对象并且年轻代内存不够用时,Young GC会被频繁触发。
Step 3
Q:: 什么是老年代GC(Major GC或Full GC)?
A:: 老年代GC(Major GC或Full GC)是在老年代空间不足时触发的垃圾回收操作。它会扫描整个老年代,并回收那些不可达的对象。相比Young GC,Major GC或Full GC的耗时更长,因为它需要处理更多对象,并且需要对整个堆进行扫描。
Step 4
Q:: 什么是对象晋升到老年代的条件?
A:: 对象晋升到老年代的条件包括:1)当对象在Survivor区经过多次Young GC后依然存活时,会被晋升到老年代。2)如果Survivor区内存不足,部分对象可能直接晋升到老年代。3
)大对象(比如长字符串或大数组)可能直接分配到老年代。
Step 5
Q:: Java内存模型中的Eden区和Survivor区分别是什么?
A:: Java堆内存中的年轻代被分为三个区域:一个Eden区和两个Survivor区(分别为S0和S1
)。新创建的对象首先被分配到Eden区,当Eden区满时,触发Young GC,存活的对象被移动到Survivor区。如果一个对象在多次GC后依然存活,它会被移动到老年代。
Step 6
Q:: 什么是内存泄漏?如何防止Java程序中的内存泄漏?
A:: 内存泄漏指的是程序中不再使用的对象无法被垃圾回收器回收,从而导致内存占用持续增长。防止内存泄漏的措施包括:1)及时关闭资源,如文件流、数据库连接。2)避免使用静态变量持有对象引用。3
)尽量减少对外部类的隐式引用,如避免匿名内部类。