JVM 之常见案例整理

本文探讨了JVM中Major GC和Minor GC的频繁问题,以及请求高峰期GC导致的服务可用性下降。详细解析了CMS垃圾收集器的工作流程,强调了Stop-The-World现象,并列举了触发Full GC的条件。最后,提出了GC优化的重要性及注意事项。

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

Major GC和Minor GC频繁:

  服务情况:Minor GC每分钟100次 ,Major GC每4分钟一次,单次Minor GC耗时25ms,单次Major GC耗时200ms。

  知识点:单次Minor GC时间更多取决于GC后存活对象的数量,而非Eden区的大小。

  小结:如果应用存在大量的短期对象,应该选择较大的年轻代;如果存在相对较多的持久对象,老年代应该适当增大。  

  扩展:动态年龄计算???

请求高峰期发生GC,导致服务可用性下降:

  CMS:

      1. Init-mark初始标记(STW) ,该阶段进行可达性分析,标记GC ROOT能直接关联到的对象,所以很快。

       2. Concurrent-mark并发标记,由前阶段标记过的绿色对象出发,所有可到达的对象都在本阶段中标记。

       2.5:并发预清理理阶段,减少下一个阶段"重新标记"的⼯作。

       3. Remark重标记(STW) ,暂停所有用户线程,重新扫描堆中的对象,进行可达性分析,标记活着的对象。因为并发标记阶段是和用户线程并发执行的过程,所以该过程中可能有用户线程修改某些活跃对象的字段,指向了一个未标记过的对象,需要 STW,这个阶段是以新生代中对象为根来判断对象是否存活的。

      4. 并发清理,进行并发的垃圾清理。

小结:由于跨代引用的存在,CMS在Remark阶段必须扫描整个堆,同时为了避免扫描时新生代有很多对象,增加了可中断的预清理阶段用来等待Minor GC的发生。只是该阶段有时间限制,如果超时等不到Minor GC,Remark时新生代仍然有很多对象,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值