一、OOM
1.top 的时候发现负载很高
2.jstat可以观察到classloader,compiler,gc相关信息(jstat命令要找到java/bin的目录)
jstat -gcutil pid 查看各个区的占比,和gc的次数。244023
$./jstat -gcutil 2403
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 100.00 100.00 100.00 95.17 92.86 3956 109.246 19043 51186.901 51296.147
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命令
(1) top -H -p pid
如果top发现某一个进程占用CPU非常高,可以用此命令进一步查看下面线程的占用情况。一般都会发现前几个有CPU占用特别高的线程。比如2985,(16进制为0xba9)
(2)下载当前的java线程栈:
jstack -l pid > ./stack.log
把进程的线程栈信息导入到当前目录的stack.log文件中。
也可以不保存,直接在线程栈信息中去查找,因为信息中都是16进制,所以要把线程号转为16进制再去查:
jstack pid | grep -A 20 0xba9 (上述得到的线程号16进制)
可以得到nid=0xba9的相关的一些信息。
.....
"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命令
(1)jmap -histo:live pid
查看当前进程的Java内存占用信息(活跃的)。
(2)dump进程文件:
top或者 ps -ef | grep java 得到当前的目标进程pid,然后用jmap命令导出整个JVM 中内存堆信息:
jmap -dump:format=b,file=./dump.out 6864
然后用eclipse Memory Analyzer或其他分析器分析。