Full GC
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:
1 | -XX:MaxGCPauseMillis=500 -XX:GCPauseIntervalMillis=3000 |
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 对系统性能的影响。