频繁gc是什么意思_CPU飙高,频繁GC,怎么排查?

本文介绍了系统运行缓慢的常见原因,包括Full GC次数过多和CPU过高,提供了详细的排查思路。针对Full GC,可以通过jstack和jstat命令观察线程和垃圾回收状态,分析内存耗尽的原因。对于CPU过高,可通过top命令定位高CPU占用的线程,再用jstack分析。此外,还讨论了不定期出现的接口耗时、线程WAITING状态和死锁等问题的排查方法,帮助开发者快速定位并解决性能问题。
摘要由CSDN通过智能技术生成

作者:爱宝贝丶

来源:my.oschina.net/zhangxufeng/blog/3017521

处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。

本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。

对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。这种情况可能的原因主要有两种:

代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致Full GC次数过多,系统缓慢;

代码中有比较耗CPU的操作,导致CPU过高,系统运行缓慢;

相对来说,这是出现频率最高的两种线上问题,而且它们会直接导致系统不可用。另外有几种情况也会导致某个功能运行缓慢,但是不至于导致系统不可用:

代码某个位置有阻塞性的操作,导致该功能调用整体比较耗时,但出现是比较随机的;

某个线程由于某种原因而进入WAITING状态,此时该功能整体不可用,但是无法复现;

由于锁使用不当,导致多个线程进入死锁状态,从而导致系统整体比较缓慢。

对于这三种情况,通过查看CPU和系统内存情况是无法查看出具体问题的,因为它们相对来说都是具有一定阻塞性操作,CPU和系统内存使用情况都不高,但是功能却很慢。下面我们就通过查看系统日志来一步一步甄别上述几种问题。

1. Full GC次数过多

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

线上多个线程的CPU都超过了100%,通过jstack命令可以看到这些线程主要是垃圾回收线程

通过jstat命令监控GC情况,可以看到Full GC次数非常多,并且次数在不断增加。

首先我们可以使用top命令查看系统CPU的占用情况,如下是系统CPU较高的一个示例:

1. `top -08:31:10 up 30 min,0 users, load average:0.73,0.58,0.34`

2. `KiBMem:2046460 total,1923864 used,122596 free,14388 buffers`

3. `KiBSwap:1048572 total,0 used,1048572 free.1192352 cached Mem`

4.

5. ` PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND`

6. `9 root 200255716028897615812 S 98.014.10:42.60 java`

可以看到,有一个Java程序此时CPU占用量达到了98.8%,此时我们可以复制该进程id9,并且使用如下命令查看呢该进程的各个线程运行情况:

top -Hp 9

该进程下的各个线程运行情况如下:

1. `top -08:31:16 up 30 min,0 users, load average:0.75,0.59,0.35`

2. `Threads:11 total,1 running,10 sleeping,0 stopped,0 zombie`

3. `%Cpu(s):3.5 us,0.6 sy,0.0 ni,95.9 id,0.0 wa,0.0 hi,0.0 si,0.0 st`

4. `KiBMem:2046460 total,1924856 used,121604 free,14396 buffers`

5. `KiBSwap:1048572 total,0 used,1048572 free.1192532 cached Mem`

6.

7. ` PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND`

8. `10 root 200255716028982415872 R 79.314.20:41.49 java`

9. `11 root 200255716028982415872 S 13.214.20:06

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值