jstack:
jstack是java虚拟机自带的一种堆栈跟踪工具:
jstack [-l] pid (pid 可以使用jps查看)
例:jstack 44076 &>$(date +%H%M)_44076.jstack.log
线程状态:
- NEW,未启动的。不会出现在Dump中
- RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁
- BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)给block住了
- WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(), join() 等语句里
- TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)
- TERMINATED,已退出的
以下表示线程在方法调用时,额外的重要的操作。线程Dump分析的重要信息。修饰上方的方法调用。
- locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。
- waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在迚入区等待。
- waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁幵在等待区等待。
- parking to wait for <地址> 目标
线程状态产生的原因:
- runnable:状态一般为RUNNABLE
- in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING
- waiting for monitor entry:进入区等待,状态为BLOCKED
- waiting on condition:等待区等待、被park
- sleeping:休眠的线程,调用了Thread.sleep()
jmap:
1. jmap -heap pid 展示pid的整体堆信息
jmap -heap 44076 >> $(date +%H%M)_44076.jmap.heap.log
2. jmap -histo pid 展示class的内存情况
jmap -histo 44076 >> $(date +%H%M)_44076.jmap.log
3. jmap -histo:live pid>a.log
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。 可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。
jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。
jmap histo:live pid &>/dev/null
jmap -histo:live 44076 >> $(date +%H%M)_44076.jmap.live.log
4. dump 将内存使用的详细情况输出到文件
jmap -dump:live,format=b,file=a.log pid
jmap -dump:live,format=b,file=$(date +%H%M)_44076.jmap.dump.log 44076
说明:内存信息dump到a.log文件中,这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。
jmap使用举例:
- 使用jps查看线程ID
- 使用jstat -gc 3331 250 20 查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。
- 使用jstat -gccause pid:额外输出上次GC原因
- 使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件
内存泄露定位过程(Memory Analyzer Tool :MAT)
打dump:jmap -dump:format=b file=yarn.dump.log 1590
之后用MemoryAnalyzer.exe分析(Memory Analyzer Tool)
https://blog.csdn.net/wanghuiqi2008/article/details/50724676