G1 Concurrent Refinement Thread 在干啥?

背景

公司内部基于 spring boot 开发自有组件并顺利上线,为 api 同学的开发带来了极大的便利,许多重要业务迁移到该组件, 这种情况下我们对组件的性能做一次深度压测。并对一些逻辑进行了合理优化,其中发现一些比较有意思的点。

测试环境

测试机型为 linux 4.19.84-300.el7.x86_64t 系统,配置为 4 核 cup, 8 g 内存,模拟每秒 3700 吞吐量,请求大小为 500 B。

性能问题

cpu 使用率 350%

定位问题

查看什么线程在占用 cpu ?

 top -Hp 9458

发现一个线程名称为 java 线程,看一下具体是那个线程。

转换tid, 通过16进制转换 printf %x 9473,nid 号为2501

jstack 看一下具体线程在干什么 jstack 9458 > /tmp/9458

发现是 G1 的 gc 线程 在搞鬼

G1(Garbage-First)垃圾回收器是一种面向服务端应用的垃圾回收器,它的工作原理如下: 1. 初始标记(Initial Mark):在此阶段,G1会暂停所有应用线程,标记所有根对象,并记录下所有从根对象直接可达的对象。 2. 并发标记(Concurrent Marking):在此阶段,G1会与应用线程并发工作,标记所有从根对象间接可达的对象。这个过程是增量进行的,即与应用线程交替执行,以减少对应用程序的停顿时间。 3. 最终标记(Final Mark):在此阶段,G1会再次暂停所有应用线程,完成并发标记阶段中未完成的对象标记。 4. 筛选回收(Live Data Counting and Evacuation):在此阶段,G1会根据堆中各个区域的回收价值进行筛选,确定哪些区域中的对象将被回收。然后,G1会将存活对象从这些区域中复制到空闲区域。 5. 复制(Humongous Copy):在此阶段,G1会将大对象(Humongous Objects)从一个区域复制到另一个区域。大对象是指超过一定阈值的对象,它们可能会导致碎片问题,G1通过复制来解决这个问题。 6. 清理(Cleanup):在此阶段,G1会清理已经被复制的区域,回收其中的未存活对象,使这些区域变为空闲状态。 7. 筛选回收(Live Data Counting and Evacuation):G1会再次进行筛选回收,重复步骤4和5,直到达到预设的回收目标。 G1垃圾回收器通过将堆内存分成多个大小相等的区域(Region),以增量的方式进行垃圾回收,从而减少应用程序的停顿时间,并且能够根据实际情况动态调整每个区域的大小,以适应不同应用的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值