一、OOM
1.top 的时候发现负载很高
2.jstat可以观察到classloader,compiler,gc相关信息
jstat -gcutil pid 查看各个区的占比,和gc的次数。244023
a-6c96cfe061ff:aa user$ jstat -gcutil 6864
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 93.75 50.27 59.64 97.38 94.67 47 0.762 5 0.858 1.620
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时
jstat -class 6864 可以查看
a-6c96cfe061ff:user$ jstat -class 6864
Loaded Bytes Unloaded Bytes Time
25615 49806.6 1 1.6 177.26
Loaded 加载的类的数量。
Bytes 加载的字节数。
Unloaded 卸载的类的数量。
Bytes 卸载的字节数。
Time 执行类加载和卸载操作所花费的时间
jstat -compiler pid
a-6c96cfe061ff:user$ jstat -compiler 6864
Compiled Failed Invalid Time FailedType FailedMethod
15453 16 0 5.57 1 com/fastjson/parser/deserializer/JavaBeanDeserializer deserialze
Compiled 已编译执行的编译任务数。
Failed 失败的编译任务数目。
Invalid 无效的编译任务数目。
Time 执行编译任务所花费的时间。
FailedType 上次编译失败的类型。
FailedMethod 失败的方法类名和上次编译失败的方法
3.jstack命令
下载当前的java线程栈:
jstack -l pid > ./stack.log
把进程的线程栈信息导入到当前目录的stack.log文件中。
.....
"main" #1 prio=5 os_prio=31 tid=0x00007fe08a019000 nid=0x1b03 in Object.wait() [0x0000700000635000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000006c0e8c848> (a java.lang.Thread)
at java.lang.Thread.join(Thread.java:1252)
- locked <0x00000006c0e8c848> (a java.lang.Thread)
at java.lang.Thread.join(Thread.java:1326)
at com.taobao.pandora.boot.loader.LaunchRunner.join(LaunchRunner.java:60)
at com.taobao.pandora.boot.loader.ReLaunchMainLauncher.reLaunch(ReLaunchMainLauncher.java:107)
at com.taobao.pandora.boot.loader.ReLaunchMainLauncher.launch(ReLaunchMainLauncher.java:40)
at com.taobao.pandora.boot.PandoraBootstrap.run(PandoraBootstrap.java:51)
at com.cainiao.arrow.Application.main(Application.java:22)
Locked ownable synchronizers:
- None
"VM Thread" os_prio=31 tid=0x00007fe088030800 nid=0x3403 runnable
"GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007fe08a800800 nid=0x2403 runnable
"GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007fe08a801800 nid=0x2603 runnable
"GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007fe08a81c800 nid=0x2803 runnable
"GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007fe08a025000 nid=0x2a03 runnable
"GC task thread#4 (ParallelGC)" os_prio=31 tid=0x00007fe08a025800 nid=0x2c03 runnable
"GC task thread#5 (ParallelGC)" os_prio=31 tid=0x00007fe08a026000 nid=0x2e03 runnable
"GC task thread#6 (ParallelGC)" os_prio=31 tid=0x00007fe08a026800 nid=0x3003 runnable
"GC task thread#7 (ParallelGC)" os_prio=31 tid=0x00007fe08a027800 nid=0x3203 runnable
"VM Periodic Task Thread" os_prio=31 tid=0x00007fe08d00b800 nid=0x6003 waiting on condition
JNI global references: 69982
4.jmap命令
dump进程文件:
top或者 ps -ef | grep java 得到当前的目标进程pid,然后用jmap命令导出整个JVM 中内存堆信息:
jmap -dump:format=b,file=./dump.out 6864
然后用eclipse Memory Analyzer或其他分析器分析。
来源:CSDN
作者:gq0811
链接:https://blog.csdn.net/gq0811/article/details/89207968