【jvm】Full GC

目录

          • [1. 说明](#1. 说明)
          • [2. 触发条件](#2. 触发条件)
          • [3. 优化](#3. 优化)
          • [4. 注意事项](#4. 注意事项)
1. 说明
  • 1.Full GC(Full Garbage Collection)是Java垃圾回收过程中最重要且最昂贵的一种操作。
  • 2.Full GC涉及对整个堆内存(包括年轻代老年代)的垃圾回收。
  • 3.当Full GC发生时,JVM会暂停所有的应用程序线程,直到垃圾回收完成,这种暂停被称为"Stop-the-World"(STW)事件。
  • 4.由于Full GC需要对整个堆进行扫描和清理,因此它会比只回收年轻代的垃圾回收(Minor GC)耗费更多的时间和资源。
2. 触发条件
  • 1.老年代空间不足:当老年代空间不足以容纳新创建的对象或被提升的对象时,会触发Full GC。
  • 2.永久代/元空间不足:永久代/元空间主要用于存储类的元数据和静态信息,因此类加载过多或类定义过多时,可能会导致Full GC。
  • 3.手动执行GC命令:使用System.gc()方法或调用Runtime.getRuntime().gc()方法可以手动触发Full GC,但这是一个建议,JVM可以选择执行。
  • 4.年代晋升失败:如对象从年轻代晋升到老年代时,老年代没有足够的空间容纳这些对象,也会触发Full GC。
  • 5.CMS的Concurrent-Mode-Failure:在使用CMS(Concurrent Mark-Sweep)垃圾收集器时,如果在Minor GC之后没有足够的空间在老年代容纳晋升对象,会触发Full GC。
  • 6.G1垃圾收集器的特殊情况:在使用G1垃圾收集器时,如果在年轻代GC后无法找到足够的连续空闲内存空间来放置所有存活对象,也会触发Full GC。
3. 优化
  • 1.调整堆的大小:通过增加老年代的大小或减少年轻代的大小,可以减少老年代空间不足而触发的Full GC。同时,设置合理的初始堆大小和最大堆大小,使得JVM启动时堆内存就达到适合的大小,减少堆扩展时可能的Full GC。
  • 2.使用合适的垃圾收集器:根据应用程序的特点选择适合的垃圾收集器可以更好地平衡内存占用和性能。例如,对于需要低延迟的应用程序,可以选择使用CMS或G1垃圾收集器。
  • 3.减少对象产生:通过对象的复用、使用对象池等方式减少对象的产生,可以降低GC的负担,从而减少Full GC的发生。
  • 4.分析Full GC日志:仔细分析Full GC日志可以帮助找出导致Full GC的根本原因。通过分析日志中的堆内存使用情况、垃圾收集时间和回收的内存量等信息,可以找到潜在的问题并进行相应的优化。
4. 注意事项
  • 1.避免频繁调用System.gc():在代码中尽量避免频繁调用System.gc()方法,因为这可能会引起不必要的Full GC。
  • 2.监控内存使用情况:使用JVM提供的监控工具(如jstat、visualvm等)监控内存使用情况,及时发现并处理内存泄漏等问题。
  • 3.选择合适的JVM参数:根据应用程序的需求选择合适的JVM参数,如堆大小、垃圾收集器类型等,以优化性能。
相关推荐
m0_748554817 小时前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
lee_curry7 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
阿正呀8 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
2501_901200538 小时前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
金銀銅鐵9 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
m0_495496419 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
forEverPlume10 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python
2301_8092047010 小时前
mysql在docker容器中如何部署_利用docker-compose快速启动
jvm·数据库·python
2301_8159019714 小时前
SQL如何将多行记录聚合成逗号分隔字符串_GROUP_CONCAT技巧
jvm·数据库·python
zjy2777715 小时前
Layui tab选项卡如何动态根据ID值进行程序化切换
jvm·数据库·python