GC是什么?为什么要GC?JVM 垃圾回收算法有哪些?

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

Java垃圾回收机制总结
1. GC是什么?为什么要GC?
Java语言中的垃圾回收机制(GC)旨在简化内存管理,使程序员专注于代码实现,而不必手动释放内存。GC自动识别并回收无用对象,从而避免内存溢出问题。类似机制也存在于其他语言如C#和Python。
2. 对象什么时候可以被回收?
当一个对象没有任何引用指向它时,该对象即为垃圾,可被垃圾回收器处理。垃圾的定位方式包括引用计数法和可达性分析算法,其中现代虚拟机主要采用可达性分析算法。
2.1 引用计数法
通过记录对象的引用次数来判断是否为垃圾,优点是实时性高,但无法解决循环引用问题,可能导致内存泄漏。
2.2 可达性分析算法
通过从根对象(GC Roots)开始分析对象的可达性,标记不可达对象为垃圾。此算法解决了引用计数法的循环引用问题。
3. JVM垃圾回收算法
3.1 标记清除算法
分标记和清除两个阶段,但可能导致内存碎片化,影响性能。
3.2 复制算法
将内存分为两块,使用其中一块,将存活对象复制到另一块清空后再交换。适合垃圾对象较多的场景,但内存利用率低。
3.3 标记整理算法
在标记清除算法基础上优化,通过移动存活对象解决内存碎片化问题,但效率较低。
3.4 分代收集算法
将堆分为新生代和老年代,并针对不同区域采用不同算法,减少垃圾回收的暂停时间。
4. JVM垃圾回收器
4.1 串行垃圾收集器
使用单线程进行垃圾回收,适用于小型应用,暂停时间长。
4.2 并行垃圾收集器
支持多线程并行回收,JDK8默认使用,适合多核环境。
4.3 CMS垃圾收集器
采用并发标记-清除算法,回收过程中应用仍可运行,停顿时间短,用户体验较好。
4.4 G1垃圾收集器
JDK9默认使用,将堆划分为多个区域,采用复制算法,兼顾响应时间和吞吐量。
5. 面试常见问题
5.1 Java垃圾回收机制
GC自动回收无用对象,减少内存管理负担。
5.2 对象回收条件
无任何引用指向的对象即为垃圾,可被回收。
5.3 JVM垃圾回收算法
包括标记清除、复制、标记整理和分代回收算法。
5.4 分代回收机制
新生代主要存放新对象,老年代存放生命周期长的对象。新生代采用复制算法,老年代采用标记整理算法。
5.5 新生代与老年代区别
新生代存储新对象,回收频率高;老年代存储长生命周期对象,回收频率低。
5.6 垃圾回收器类型
包括串行、并行、CMS和G1垃圾收集器。
5.7 GC类型
Minor GC:新生代回收;Major GC:老年代回收;Full GC:新生代与老年代整体回收,应尽量避免。
原创不易,感谢支持!
想要了解更多内容?



白皮书上线