解决线上Java程序GC频繁问题思路

1、Full GC次数过多

这种情况比较容易出现,尤其是新功能上线时。对应Full GC 较多的情况,其主要有如下两个特征:

  • 线上多个线程的CPU都超过了100%,通过jstack命令可以看到这些线程主要是垃圾回收线程
  • 通过jstat命令监控GC情况,可以看到Full GC 次数非常多,并且次数在不断增加

对应的排查操作方向如下:

  • 使用top命令查看系统CPU的占用情况
  • 找到CPU占用量最高的Java程序,并用top命令查看该进程的各个线程运行情况
  • 通过jstack命令查看具体某个线程为什么耗费CPU最高
  • 根据具体的信息,来继续一步步排查问题所在

2、CPU过高

首先通过top命令查看当前CPU消耗过高的进程是哪个,从而得到进程ID,然后通过top -HP来查看进程中有哪些线程CPU过高,一般超过80%就是比较高的,80%左右是合理情况。得到CPU消耗比较高的线程id,接着通过id的十六进制表示在jstack日志中查看当前线程具体的堆栈信息。

分析导致CPU过高原因具体是Full GC 次数过多还是代码中比较耗时的计算,如果Full GC次数过多,那么通过jstack得到的线程信息会是类似VMThread之列的线程,而如果是代码中有比较耗时的计算,那么得到的就是线程的具体堆栈信息。

3、不定期出现的接口耗时现象

比较典型的例子就是,某个接口访问经常需要2-3秒才能返回,其消耗的CPU不多,而且占用的内存也不高,也就是说,通过上述两种方法排查无法解决这种问题。

由于这样的接口耗时比较大的问题是不定时出现的,首先需要找到该接口,通过压测工具不断加大访问力度,如果说该接口中有某个位置是比较耗时的,由于访问频率比较高,那么大多数的线程最终都将阻塞于改阻塞点,这样通过多个线程具有相同的堆栈日志,基本上就可以定位到该接口中比较耗时的diam位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵然间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值