linux Java问题诊断和排查工具(查看JVM参数、内存使用情况及分析等)

主要针对Linux环境的jvm 内存问题排查

1、找出排查的Jar包pid

 指令  jps -l 查看本机java进程信息

        linux Java问题诊断和排查工具(查看JVM参数、内存使用情况及分析等)_第1张图片

         innovent-boss-service.jar 是需要排查的java应用

        jps -ml查看更详细的运行参数

        

126912 innovent-boss-service.jar --spring.profiles.active=prod --server.port=9320 --spring.redis.host=10.0.2.81 --spring.redis.port=6379 -XX:+UseParallelGC
63347 -- process information unavailable
36787 innovent-mic-service.jar --spring.profiles.active=test --server.port=9323 --spring.redis.host=10.0.2.81 --spring.redis.port=6379 -XX:+UseParallelGC
64340 innovent-system-extend.jar --spring.profiles.active=prod --spring.cloud.nacos.discovery.server-addr=171.16.0.190:8848 --spring.cloud.nacos.config.server-addr=172.16.21.190:8848 --server.port=9213
86215 sun.tools.jps.Jps -ml

2、接着看jvm内存分配情况

    指令 jmap -heap 126912 查看jar包的内存分配情况

using thread-local object allocation.
Parallel GC with 2 thread(s)  //使用的垃圾收集器 Parallel GC   

Heap Configuration:            //堆内存初始化配饰
   MinHeapFreeRatio         = 0 //堆最小空闲比率
   MaxHeapFreeRatio         = 100//堆最大空闲比率
   MaxHeapSize              = 4294967296 (4096.0MB)//堆最大大小
   NewSize                  = 1431306240 (1365.0MB)//堆新生代的默认大小
   MaxNewSize               = 1431306240 (1365.0MB)//堆新生代的最大大小
   OldSize                  = 2863661056 (2731.0MB)//老年代大小
   NewRatio                 = 2//新生代和老年代的大小比率
   SurvivorRatio            = 8//年轻代中Eden区域survivor区的大小比率
   MetaspaceSize            = 21807104 (20.796875MB)// 元空间大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB)//压缩空间大小
   MaxMetaspaceSize         = 17592186044415 MB// 最大元空间大小
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 1393557504 (1329.0MB)
   used     = 1344963592 (1282.6572341918945MB)
   free     = 48593912 (46.34276580810547MB)
   96.51295968336302% used
From Space:
   capacity = 18350080 (17.5MB)
   used     = 12300992 (11.73114013671875MB)
   free     = 6049088 (5.76885986328125MB)
   67.03508649553571% used
To Space:
   capacity = 18874368 (18.0MB)
   used     = 0 (0.0MB)
   free     = 18874368 (18.0MB)
   0.0% used
PS Old Generation
   capacity = 2863661056 (2731.0MB)
   used     = 92418968 (88.1375961303711MB)
   free     = 2771242088 (2642.862403869629MB)
   3.2273012131223395% used

48060 interned Strings occupying 4988304 bytes.

3.查看堆中对象数量和大小

[root@Dashboard-Boss01 ~]# jstack 126912

126912: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

我们报错了 是应为当前是用户root ,而我是用jenkins发布的应用 所以得用发布应用的用户执行

查看应用执行用户 ps -aux|grep innovent-boss-service.jar

[root@Dashboard-Boss01 ~]# ps -aux|grep innovent-boss-service.jar
root      86275  0.0  0.0 112812   992 pts/0    S+   17:25   0:00 grep --color=auto innovent-boss-service.jar
jenkins  126912  1.2 11.5 7038584 1915508 ?     Sl   Dec03 109:34 java -javaagent:/usr/local/agent/skywalking-agent.jar -Dskywalking.agent.service_name=innovent-boss-service -Xms4g -Xmx4g -jar innovent-boss-service.jar --spring.profiles.active=prod --server.port=9320 --spring.redis.host=10.0.2.81 --spring.redis.port=6379 -XX:+UseParallelGC

可以看到我的执行用户是jenkins

切换用户 jenkins

4、查看垃圾回收情况

        jstat指令 6秒打印一次显示20行

[root@Dashboard-Boss01 ~]# jstat -gc 126912 6000 20
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
17920.0 17408.0 8673.0  0.0   1362432.0 66175.5  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 66175.5  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 66175.5  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 67017.3  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 67025.5  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 71978.9  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 72292.7  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 72320.4  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 73537.7  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 73537.7  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 75100.9  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 75100.9  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746
17920.0 17408.0 8673.0  0.0   1362432.0 75100.9  2796544.0   90376.2   124120.0 116553.5 15360.0 14086.8    162    3.086   4      0.660    3.746

 S0C:年轻代第一个survivor的容量(字节)
S1C:年轻代第二个survivor的容量(字节)
S0U:年轻代第一个survivor已使用的容量(字节)
S1U:年轻代第二个survivor已使用的容量(字节)
EC:年轻代中Eden的空间(字节)
EU:年代代中Eden已使用的空间(字节)
OC:老年代的容量(字节)
OU:老年代中已使用的空间(字节)
PC:永久代的容量
PU:永久代已使用的容量
YGC:从应用程序启动到采样时年轻代中GC的次数
YGCT:从应用程序启动到采样时年轻代中GC所使用的时间(单位:S)
FGC:从应用程序启动到采样时老年代中GC(FULL GC)的次数
FGCT:从应用程序启动到采样时老年代中GC所使用的时间(单位:S)

 5、GC日志分析-我们先通过一条《深入理解java虚拟机》一书中的一个例子gc日志来回顾一下gc日志的基本知识,下面是一条gc日志:

        从左至右,各个信息的意思为:

33.125: 自虚拟机启动以来经过的秒数,单位为秒;
GC: 垃圾收集的停顿类型为不需要STW(Stop The World )。如果是Full GC说明发生了STW。如果是Full GC (System)说明是调用System.gc()方法所触发的收集。
DefNew:表示GC发生的区域在新生代。这个名称和所使用的收集器密切相关。可以有Tenured、Perm、ParNew、PSYoungGen等等。其中hotspot虚拟机使用的是PSYoungGen代表新生代
3324k->152k(3712k):GC前该区域(DefNew)已使用容量->GC后该区域已使用容量(该内存区域总容量)
0.0025925 secs:该内存区域(DefNew)GC所占用的时间。
3324k->152k(11904k):GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)

你可能感兴趣的:(java)