记录项目中遇到的一次jvm调优

项目中的导出导入功能出现问题,调用RPC服务后客户端卡住,服务方未收到请求。检查发现JVM内存设置与实际需求不符,FGC频繁。通过调整-Xms和-Xmx参数,减少FGC次数,问题得到解决。环境为JDK1.8,使用jstat等工具进行监控和诊断。

情况:

项目的导出导入功能突然用不了了,但是服务方(导入导出单独拆分出来了一个数据处理服务)重启后就又可以用了。

客户端调用rpc服务时,调用前的log有打印,但是打印后(调用服务后)就没有下文直接卡住了(还好是异步操作不影响主流程),客户端无报错。

服务方没有发现请求log,也就是说,请求没有打到服务方上来。

但是项目一直稳定运行,且最近也没上线无变动,

也查了下客户端调用的服务方ip,无误

后来ps -aux | grep java看了下-Xms(初始堆大小)和-Xmx(最大堆大小)都是2G(公司的服务管理平台中的服务不配置jvm参数的话默认2G,我们服务由服务管理平台管理),但是服务实例的内存申请了10G,于是猜想是不是内存不够用了,

然后jstat -gcutil 进程号 线程号 命令查看资源使用情况,发现FGC次数有点高,修改了内存大小之后再重启服务,FGC次数大幅度减少。

环境:jdk1.8

附:用到的jstat命令(后文有命令详情)

jstat参数

\*C => (Capacity)区容量

\*U => (Used)使用量

  1. jstat -gcutil pid  总结垃圾回收统计                                                                    

S0:幸存1区当前使用比例

S1:幸存2区当前使用比例

E:伊甸园区使用比例

O:老年代使用比例

M:元数据区使用比例

CCS:压缩使用比例

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

  1. jstat -gc  pid  垃圾回收统计

- S0C:第一个幸存区的大小

- S1C:第二个幸存区的大小

- S0U:第一个幸存区的使用大小

- S1U:第二个幸存区的使用大小

- EC:伊甸园区的大小

- EU:伊甸园区的使用大小

- OC:老年代大小

- OU:老年代使用大小

- MC:方法区大小

- MU:方法区使用大小

- CCSC:压缩类空间大小

- CCSU:压缩类空间使用大小

- YGC:年轻代垃圾回收次数

- YGCT:年轻代垃圾回收消耗时间

- FGC:老年代垃圾回收次数

- FGCT:老年代垃圾回收消耗时间

- GCT:垃圾回收消耗总时间

参考文档

jstat参数详解:

https://cloud.tencent.com/developer/article/1158596

https://www.cnblogs.com/yjd_hycf_space/p/7755633.html

JVM内存结构:

https://www.cnblogs.com/ityouknow/p/5610232.html

jstack堆栈追踪工具

https://www.cnblogs.com/kongzhongqijing/articles/3630264.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值