interview
java-virtual-machine
Java的CMS垃圾回收流程是怎样的?

Java虚拟机面试题, Java 的 CMS 垃圾回收流程是怎样的?

Java虚拟机面试题, Java 的 CMS 垃圾回收流程是怎样的?

QA

Step 1

Q:: Java 的 CMS 垃圾回收流程是怎样的?

A:: CMS(Concurrent Mark-Sweep)垃圾回收器是Java虚拟机中常用的低停顿垃圾收集器。它的主要流程包括以下几个阶段:1. 初始标记(Initial Mark):标记GC Roots直接可达的对象,这个阶段会短暂地暂停所有应用线程。2. 并发标记(Concurrent Mark):在应用线程继续运行的情况下,标记所有从GC Roots可达的对象。3. 重新标记(Remark):修正并发标记阶段中应用线程继续运行所产生的新对象引用变化,这个阶段需要短暂暂停应用线程。4. 并发清理(Concurrent Sweep):在应用线程运行的情况下,清理那些不再使用的对象并回收它们的内存空间。5. 重置(Reset):重置数据结构,为下一次GC做准备。CMS的主要优势是停顿时间较短,但它可能导致内存碎片化,且在极端情况下会触发Full GC。

用途

面试这个内容主要是为了考察候选人对Java内存管理和垃圾回收机制的理解。垃圾回收器的选择和调优直接影响Java应用的性能和稳定性,尤其是在高并发、大内存的应用场景下。掌握CMS的工作原理,能够帮助开发者在系统性能调优时做出更加合理的选择,避免由于错误的垃圾回收器设置导致的长时间停顿(例如Full GC)。生产环境中,尤其是在需要低延迟响应的系统中,CMS经常被用到。了解其内部工作机制能够帮助开发者更好地调试和优化Java应用。\n

相关问题

🦆
什么是Java的GC Roots?

GC Roots是Java垃圾回收机制中用来作为根节点的对象集合,垃圾回收器从这些根对象开始,递归地查找并标记所有可达的对象。常见的GC Roots包括:1. 虚拟机栈中引用的对象;2. 方法区中类静态属性引用的对象;3. 方法区中常量引用的对象;4. 本地方法栈中JNI(即Native方法)引用的对象。理解GC Roots对于理解垃圾回收机制的工作原理至关重要。

🦆
CMS垃圾回收器与G1垃圾回收器的主要区别是什么?

CMS(Concurrent Mark-Sweep)和G1(Garbage First)都是用于降低垃圾回收停顿时间的GC算法,但它们有明显的区别。CMS主要是以并发标记和清理来减少停顿时间,但容易产生内存碎片,且在内存不足时可能会引发Full GC。G1则通过分区(Region)将堆划分为多个小块,并优先回收垃圾最多的分区,从而避免了内存碎片,并提供更可预测的停顿时间。G1还支持在后台维护全局对象引用的集合,从而提高垃圾收集的效率。

🦆
在什么情况下会触发Java的Full GC?

Full GC是一次全堆垃圾回收,包括Young代和Old代。当老年代的内存不足,无法容纳新生代晋升的对象时,会触发Full GC。其他触发Full GC的原因包括:1. CMS失败后触发的Serial Old垃圾收集器;2. 系统调用System.gc()方法;3. 持久代(PermGen)或元空间(Metaspace)空间不足。Full GC会导致应用线程完全停顿,因此在性能敏感的系统中,应该尽量避免触发Full GC。