JVM GC流程

本文深入探讨Java对象从创建到回收的全过程,包括对象在Eden区、Survivor区及老年代的流转机制,以及MinorGC和FullGC触发条件与处理流程。解析分配担保策略与大对象直接进入老年代的细节,帮助理解如何通过调整参数优化垃圾回收效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 对象的分配和回收

                                                                 

  • java对象优先分配在Eden区和一个Survivor区(Eden和Survivor的比例可以配置,比如8:1),当Eden区和Survivor区内存不够对象分配时,触发一次MinorGC,将Eden区和Survivor区中存活的对象移入到另一个Survivor区,并将Eden和Survivor进行回收。
  • 如果另一个Survivor区不够装入存活的对象时,使用分配担保策略将这些对象存入老年代。
  • java大对象直接分配到老年代。长字符串或者大数组这类大对象会在超过设定的阈值后直接存入老年代,避免其在Eden区频繁地引发Minor GC,来回复制。
  • 上图 s1 和 s2 同时只会用其中一个块,假如Eden+s1 进行MinorGc ,存活下的进入s2 , 下次Eden+s2 进行MinorGc ,进入s1。
  • 这里有一概念叫做年龄阈值,每个对象定义了年龄计数器,经过一次 Minor GC (在交换区)后年龄加1,对象年龄达到15次后将会晋升到老年代,老年代空间不够时进行 Full GC。

 

  2. JVM完整的GC流程

  对象的正常流程:Eden 区 -> Survivor 区 -> 老年代。

  新生代GC:Minor GC;老年代GC:Full GC,比 Minor GC 慢10倍,JVM 会“stop the world”,严重影响性能。

【总结】:内存区域不够用了,就会引发GC。Minor GC 避免不了,Full GC 尽量避免。

【处理方式】:保存堆栈快照日志、分析内存泄漏、调整内存设置控制垃圾回收频率,选择合适的垃圾回收器等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值