Full GC
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001
1. 什么是Full GC?
Full GC(Full Garbage Collection)是指对整个JVM堆内存中的对象进行全面的垃圾回收。在Java中,堆内存被划分为新生代(Young Generation)和老年代(Old Generation)。新生代主要存放新创建的对象,而老年代则存放已经存活一段时间的对象。Full GC主要针对老年代进行垃圾回收。
2. 为什么需要Full GC?
Full GC是由于老年代内存空间占用过多、垃圾对象较多等情况下触发的。当老年代的内存空间无法满足新对象的分配或者没有足够的连续内存空间时,会触发Full GC以回收不再使用的对象,释放内存空间。
3. Full GC的实现原理?
Full GC的实现原理与Young GC(新生代垃圾回收)不同。Young GC只回收新生代的对象,而Full GC则对整个堆内存进行扫描和回收。
Full GC的实现通常分为以下几个阶段:
3.1. 标记阶段
标记阶段是Full GC的第一个阶段,通过遍历整个堆内存,标记出所有存活的对象。标记的方式通常采用“可达性分析算法”,从根对象(如GC Roots)开始,逐个遍历对象,标记出所有可达的对象。
3.2. 筛选阶段
筛选阶段是Full GC的第二个阶段,通过筛选出不再被引用的对象,将其标记为垃圾对象。筛选的方法有几种,如引用计数法、引用链法等。
3.3. 垃圾回收阶段
在垃圾回收阶段,被标记为垃圾对象的内存将会被回收,释放给堆内存。具体的回收方法可以有清除(直接回收),复制(将存活对象复制到其他内存区域),标记-清除(标记垃圾对象后清除)等。
3.4. 压缩阶段
压缩阶段是Full GC的最后一个阶段,其主要目的是收集堆内存中的碎片化空间。通过移动对象的位置,使得堆内存中的连续空闲空间最大化,以供后续的对象分配使用。
4. Full GC的使用示例
Full GC的触发并不是由我们代码显式调用,而是由JVM自动触发的。可以通过指定JVM参数来设置Full GC的频率和阈值。例如,可以使用以下参数来设置Full GC的阈值为5次Young GC后进行一次Full GC:
5. Full GC的优点
可以对整个堆内存进行全面的垃圾回收,释放不再使用的对象,避免内存泄漏。
可以优化堆内存的空间利用,减少碎片化空间。
可以保证JVM的性能稳定,避免因为堆内存不足导致频繁的OutOfMemoryError。
6. Full GC的缺点
Full GC通常比Young GC耗时更长,可能会引发较长的停顿时间,影响系统的响应性能。
Full GC需要清理整个堆内存,会占用一定的CPU和内存资源。
7. Full GC的使用注意事项
尽量避免Full GC的频繁触发,可以调整JVM参数来适当增加Young GC的次数,减少Full GC的发生。
需要根据具体的应用场景和性能需求来调整Full GC的阈值和频率,以避免对系统性能造成太大的影响。
建议使用性能监控工具对Full GC进行监控和分析,及时发现和解决Full GC导致的性能问题。
8. 总结
Full GC是针对整个堆内存的垃圾回收过程,通过标记、筛选和回收等阶段,可以释放不再使用的对象,优化堆内存的空间利用。尽管Full GC可能会导致较长的停顿时间,但合理设置Full GC的阈值和频率,以及对Full GC进行监控和分析,可以有效避免Full GC对系统性能的影响。
最后更新于