系统卡顿之垃圾回收机制

1.检查gc

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

  

[risk@localhost ~]$ jstat -gc -h3 2897 1000 10
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
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
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
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
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
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
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
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
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
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
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
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
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
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
 
这段内容是通过 jstat -gc -h3 2897 1000 10 命令输出的Java虚拟机(JVM)垃圾回收(GC)统计信息。下面是对这些信息的详细分析:

命令解释

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

输出列解释

  • 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. 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秒。

结论

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

建议

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

 2.定位具体代码

定位进程

[risk@46100v8t100 ~]$ top

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                        
23147 risk      20   0 9817.2m 1.124g  13232 S 392.7  7.2   6105:19 java                                                                                                                                                                           
18915 risk      20   0  9.862g 3.300g  14940 S  11.6 21.3 244:07.43 java                                                                                                                                                                           
22809 risk      20   0 9183200 996568  13108 S   4.3  6.1 123:32.59 java                                                                                                                                                                           
11206 risk      20   0 3238776 596348    248 S   1.3  3.7   2548:43 InterfaceDtpf                                                                                                                                                                  
  519 risk      20   0  488948   2748    216 S   1.0  0.0   1270:44 InterfaceCtpRis                                                                                                                                                                
 5504 oracle    -2   0 5178264   1320    888 S   1.0  0.0   3083:08 ora_vktm_ksfix                                                                                                                                                                 
11675 risk      20   0  152872   3028   1320 S   1.0  0.0   0:00.22 sshd                

可以使用以下大概知道那个服务的问提

[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

  定位线程

[risk@46100v8t100 ~]$ top -H -p 23147

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                                         
23585 risk      20   0 9817.2m 1.125g  13232 R 97.3  7.2   1523:02 java                                                                                                                                                                            
23589 risk      20   0 9817.2m 1.125g  13232 R 96.0  7.2   1522:45 java                                                                                                                                                                            
23590 risk      20   0 9817.2m 1.125g  13232 R 96.0  7.2   1522:36 java                                                                                                                                                                            
23587 risk      20   0 9817.2m 1.125g  13232 R 95.0  7.2   1522:42 java                                                                                                                                                                            
23588 risk      20   0 9817.2m 1.125g  13232 S  0.7  7.2   4:05.15 java                                                                                                                                                                            
23586 risk      20   0 9817.2m 1.125g  13232 S  0.3  7.2   3:51.96 java   

  转换16进制

[risk@46100v8t100 ~]$ printf "%x\n" 23585
5c21

  定位具体代码如下

[risk@46100v8t100 ~]$ jstack 23147 | grep '5c21' -C5 --color
        at risk10.msg.com.ks.future.riskv10.producer.KafkaProducer.run(KafkaProducer.java:73)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

"pool-3-thread-1" #27 prio=5 os_prio=0 tid=0x00007f5a04037800 nid=0x5c21 runnable [0x00007f5a6a98e000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.Thread.yield(Native Method)
        at com.lmax.disruptor.YieldingWaitStrategy.applyWaitMethod(YieldingWaitStrategy.java:57)
        at com.lmax.disruptor.YieldingWaitStrategy.waitFor(YieldingWaitStrategy.java:39)
        at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56)
[risk@46100v8t100 ~]$ 

  

 

posted @ 2025-01-17 09:10  皮军旗  阅读(44)  评论(0)    收藏  举报