一、堆信息
1、查看堆空间配置信息,jmap –heap +进程id
看名字即了解表示哪些区内存大小,占比
2、打印各class的实例数目,内存占用,类全名信息 jmap -histo:live (+进程id|more),依次标识【大小排序,实例数量,内存占用大小,类名】
3、将进行堆快照导出文件 jmap–dump:live,format=b,file=aaa.bin 65474
注意:1)导出后一般结合MAT工具分析堆日志信息,可查看到对象调用链等关系;2)排查堆空间问题,建议dump2-3次,如果每次 dump都指向同一个问题,才确定问题根源
4、打印正等候回收的对象的信息 jmap -finalizerinfo +进程id ;0个对象在等待回收
二、线程信息
查看线程,jstack +进程id,查看结果:
1)JVM内部的后台线程信息,这些线程往往在JVM初始化的时候就存在
"Attach Listener" daemon prio=10 tid=0x0000000052fb8000 nid=0xb8f waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None destroyJavaVM" prio=10 tid=0x00002aaac1225800 nid=0x7208 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None
2)用户级别的线程信息,业务逻辑相关(重点关注。最容易产生死锁的地方)
"qtp496432309-42" prio=10 tid=0x00002aaaba2a1800 nid=0x7580 waiting on condition [0x00000000425e9000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x0000000788cfb020> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:320) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:479) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None线程的状态:waiting on condition(等待条件发生)
线程的调用情况;
线程对资源的锁定情况;
三、JVM状态信息
1.查看gc情况 jstat -gcutil 65474 1000 5 (间隔1s查询1次,一共查询5次)
S0\S1\E\O\M:各空间已使用容量占当前容量的比值。年轻代(S0\S1\E),老年代(O),元空间(M)
CCS:压缩使比例;YGC\FGC:年轻代\老年代 gc次数;YGCT\FGCT:年轻代\老年代 gc时间;GCT:gc总耗时时间
2.查看gc内存容量 jstat -gccapacity 65474 1000 5
3.查看类加载信息 jstat -class 65474 1000 5
Loaded | 加载class的数量 |
Bytes | 所占用空间大小 |
Unloaded | 未加载数量 |
Bytes | 未加载占用空间 |
Time | 时间 |