系统卡顿之垃圾回收机制

1|01.检查gc

1
2
3
4
5
6
7
8
9
10
<code-pre class="code-pre" id="pre-2xhA28"><code-line class="line-numbers-rows"></code-line>[risk@localhost ~]$ top
<code-line class="line-numbers-rows"></code-line>  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                       
<code-line class="line-numbers-rows"></code-line> 2897 risk      20   0 7987112   1.6g   6008 S 100.7 13.7   1335:25 java                                                                                                                                                                          
<code-line class="line-numbers-rows"></code-line>12039 risk      20   0 5675740 749656   6476 S  24.9  6.1  27:00.96 java                                                                                                                                                                          
<code-line class="line-numbers-rows"></code-line>21039 risk      20   0 8182740   2.6g   6276 S   9.3 22.5 240:32.33 java                                                                                                                                                                          
<code-line class="line-numbers-rows"></code-line> 7525 risk      20   0 5909196   2.0g   6028 S   3.0 16.9 152:09.23 java                                                                                                                                                                          
<code-line class="line-numbers-rows"></code-line>11738 oracle    -2   0 5192068    440    328 S   1.7  0.0   2836:25 oracle                                                                                                                                                                        
<code-line class="line-numbers-rows"></code-line>    6 root      20   0       0      0      0 S   1.0  0.0   2268:27 ksoftirqd/0                                                                                                                                                                   
<code-line class="line-numbers-rows"></code-line>19716 oracle    20   0 5194940  26068  23040 S   1.0  0.2   0:05.36 oracle                      
</code-pre>

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<code-pre class="code-pre" id="pre-xYEaTX"><code-line class="line-numbers-rows"></code-line>[risk@localhost ~]$ jstat -gc -h3 2897 1000 10
<code-line class="line-numbers-rows"></code-line> S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT  
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 23256.0  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 29958.5  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 29958.5  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796
<code-line class="line-numbers-rows"></code-line> S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT  
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 29958.5  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 36660.9  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 36660.9  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796
<code-line class="line-numbers-rows"></code-line> S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT  
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 36978.9  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 43683.4  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 43683.4  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796
<code-line class="line-numbers-rows"></code-line> S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT  
<code-line class="line-numbers-rows"></code-line>1024.0 1024.0  0.0   736.0  1145856.0 43683.4  2541568.0   38710.4   68864.0 65402.7 8192.0 7422.6    173    8.629   3      2.167   10.796</code-pre>
 
这段内容是通过 jstat -gc -h3 2897 1000 10 命令输出的Java虚拟机(JVM)垃圾回收(GC)统计信息。下面是对这些信息的详细分析:

1|0命令解释

  • jstat -gc:输出垃圾回收统计信息,-gc 选项表示输出GC相关的统计信息。
  • -h3:每3行输出一个标题行,方便阅读。
  • 2897:目标Java进程的进程ID。
  • 1000:采样间隔,单位为毫秒,这里表示每1000毫秒(1秒)采样一次。
  • 10:采样次数,总共采样10次。

1|0输出列解释

  • S0C:Survivor 0区的容量(以KB为单位)。
  • S1C:Survivor 1区的容量(以KB为单位)。
  • S0U:Survivor 0区已使用的空间(以KB为单位)。
  • S1U:Survivor 1区已使用的空间(以KB为单位)。
  • EC:Eden区的容量(以KB为单位)。
  • EU:Eden区已使用的空间(以KB为单位)。
  • OC:Old区的容量(以KB为单位)。
  • OU:Old区已使用的空间(以KB为单位)。
  • MC:Metaspace区的容量(以KB为单位)。
  • MU:Metaspace区已使用的空间(以KB为单位)。
  • CCSC:Compressed Class Space区的容量(以KB为单位)。
  • CCSU:Compressed Class Space区已使用的空间(以KB为单位)。
  • YGC:Young Generation GC(年轻代GC)的次数。
  • YGCT:Young Generation GC的总耗时(以秒为单位)。
  • FGC:Full GC(全GC)的次数。
  • FGCT:Full GC的总耗时(以秒为单位)。
  • GCT:GC的总耗时(以秒为单位)。

1|0数据分析

从输出数据中,我们可以看到以下信息:
  1. Survivor区:
    • S0C 和 S1C:Survivor 0区和Survivor 1区的容量都是1024KB。
    • S0U 和 S1U:Survivor 0区始终为空(0.0KB),Survivor 1区的使用量在736.0KB左右,没有变化。
  2. Eden区:
    • EC:Eden区的容量为1145856KB。
    • EU:Eden区的使用量在23256.0KB到43683.4KB之间逐渐增加。
  3. Old区:
    • OC:Old区的容量为2541568KB。
    • OU:Old区的使用量始终为38710.4KB,没有变化。
  4. Metaspace区:
    • MC:Metaspace区的容量为68864KB。
    • MU:Metaspace区的使用量为65402.7KB,没有变化。
  5. Compressed Class Space区:
    • CCSC:Compressed Class Space区的容量为8192KB。
    • CCSU:Compressed Class Space区的使用量为7422.6KB,没有变化。
  6. GC统计:
    • YGC:年轻代GC的次数为173次。
    • YGCT:年轻代GC的总耗时为8.629秒。
    • FGC:全GC的次数为3次。
    • FGCT:全GC的总耗时为2.167秒。
    • GCT:GC的总耗时为10.796秒。

1|0结论

  • Eden区:Eden区的使用量在逐渐增加,这表明应用正在不断创建新的对象。如果Eden区的使用量持续增加,可能会触发更多的年轻代GC。
  • Survivor区:Survivor 1区的使用量相对稳定,表明对象在年轻代中的存活时间较短,大部分对象在几次GC后就被回收了。
  • Old区:Old区的使用量相对稳定,表明应用中长期存活的对象数量变化不大。
  • Metaspace区:Metaspace区的使用量相对稳定,表明类的加载和卸载相对平衡。
  • GC性能:年轻代GC的次数较多,但总耗时相对较少,表明年轻代GC的效率较高。全GC的次数较少,但每次耗时较长,这可能会影响应用的响应时间。

1|0建议

  • 监控:持续监控JVM的GC情况,特别是Eden区的使用量,如果Eden区的使用量持续增加,可能需要调整堆大小或优化代码。
  • 调优:如果应用的响应时间受到全GC的影响,可以考虑调整GC策略或增加堆大小,以减少全GC的频率和耗时。
  • 分析:如果Eden区的使用量持续增加,可以使用工具(如 jmap)生成堆转储文件,分析内存泄漏或内存溢出的原因。

2|0 2.定位具体代码

定位进程

1
2
3
4
5
6
7
8
9
10
<code-pre class="code-pre" id="pre-cFp5fE"><code-line class="line-numbers-rows"></code-line>[risk@46100v8t100 ~]$ top
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                       
<code-line class="line-numbers-rows"></code-line>23147 risk      20   0 9817.2m 1.124g  13232 S 392.7  7.2   6105:19 java                                                                                                                                                                          
<code-line class="line-numbers-rows"></code-line>18915 risk      20   0  9.862g 3.300g  14940 S  11.6 21.3 244:07.43 java                                                                                                                                                                          
<code-line class="line-numbers-rows"></code-line>22809 risk      20   0 9183200 996568  13108 S   4.3  6.1 123:32.59 java                                                                                                                                                                          
<code-line class="line-numbers-rows"></code-line>11206 risk      20   0 3238776 596348    248 S   1.3  3.7   2548:43 InterfaceDtpf                                                                                                                                                                 
<code-line class="line-numbers-rows"></code-line>  519 risk      20   0  488948   2748    216 S   1.0  0.0   1270:44 InterfaceCtpRis                                                                                                                                                               
<code-line class="line-numbers-rows"></code-line> 5504 oracle    -2   0 5178264   1320    888 S   1.0  0.0   3083:08 ora_vktm_ksfix                                                                                                                                                                
<code-line class="line-numbers-rows"></code-line>11675 risk      20   0  152872   3028   1320 S   1.0  0.0   0:00.22 sshd                <br><br>可以使用以下大概知道那个服务的问提</code-pre>

[risk@46100v8t100 ~]$ jps -l
18915 ./../lib/riskv10-riskquery.jar
25573 sun.tools.jps.Jps
22809 ./../lib/risk10-warn.jar
23147 ./../lib/riskv10-msg.jar
3774 /home/risk/risk_gateway/bin/../lib/riskv10-gateway.jar
32207 /home/risk/risk_market/bin/../lib/risk10-market.jar

  定位线程

1
2
3
4
5
6
7
8
9
10
<code-pre class="code-pre" id="pre-tw8Gs4"><code-line class="line-numbers-rows"></code-line>[risk@46100v8t100 ~]$ top -H -p 23147
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                                        
<code-line class="line-numbers-rows"></code-line>23585 risk      20   0 9817.2m 1.125g  13232 R 97.3  7.2   1523:02 java                                                                                                                                                                           
<code-line class="line-numbers-rows"></code-line>23589 risk      20   0 9817.2m 1.125g  13232 R 96.0  7.2   1522:45 java                                                                                                                                                                           
<code-line class="line-numbers-rows"></code-line>23590 risk      20   0 9817.2m 1.125g  13232 R 96.0  7.2   1522:36 java                                                                                                                                                                           
<code-line class="line-numbers-rows"></code-line>23587 risk      20   0 9817.2m 1.125g  13232 R 95.0  7.2   1522:42 java                                                                                                                                                                           
<code-line class="line-numbers-rows"></code-line>23588 risk      20   0 9817.2m 1.125g  13232 S  0.7  7.2   4:05.15 java                                                                                                                                                                           
<code-line class="line-numbers-rows"></code-line>23586 risk      20   0 9817.2m 1.125g  13232 S  0.3  7.2   3:51.96 java  
</code-pre>

  转换16进制

1
2
3
<code-pre class="code-pre" id="pre-Xwh8Se"><code-line class="line-numbers-rows"></code-line>[risk@46100v8t100 ~]$ printf "%x\n" 23585
<code-line class="line-numbers-rows"></code-line>5c21
</code-pre>

  定位具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<code-pre class="code-pre" id="pre-MK3Rek"><code-line class="line-numbers-rows"></code-line>[risk@46100v8t100 ~]$ jstack 23147 | grep '5c21' -C5 --color
<code-line class="line-numbers-rows"></code-line>        at risk10.msg.com.ks.future.riskv10.producer.KafkaProducer.run(KafkaProducer.java:73)
<code-line class="line-numbers-rows"></code-line>        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
<code-line class="line-numbers-rows"></code-line>        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
<code-line class="line-numbers-rows"></code-line>        at java.lang.Thread.run(Thread.java:745)
<code-line class="line-numbers-rows"></code-line>
<code-line class="line-numbers-rows"></code-line>"pool-3-thread-1" #27 prio=5 os_prio=0 tid=0x00007f5a04037800 nid=0x5c21 runnable [0x00007f5a6a98e000]
<code-line class="line-numbers-rows"></code-line>   java.lang.Thread.State: RUNNABLE
<code-line class="line-numbers-rows"></code-line>        at java.lang.Thread.yield(Native Method)
<code-line class="line-numbers-rows"></code-line>        at com.lmax.disruptor.YieldingWaitStrategy.applyWaitMethod(YieldingWaitStrategy.java:57)
<code-line class="line-numbers-rows"></code-line>        at com.lmax.disruptor.YieldingWaitStrategy.waitFor(YieldingWaitStrategy.java:39)
<code-line class="line-numbers-rows"></code-line>        at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56)
<code-line class="line-numbers-rows"></code-line>[risk@46100v8t100 ~]$
</code-pre>

  

 


__EOF__

本文作者皮军旗
本文链接https://www.cnblogs.com/pijunqi/p/18675034.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   皮军旗  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示