引言
回顾下上两节的基础知识:
- jps(java process status)
用来查看所有的jvm进程,包括进程ID,进程启动的路径等。jps -l 可以具体到包启动路径的进程 - jinfo
负责观察进程运行环境参数,包括Java System属性和JVM命令行参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息 - jstat
查看JVM统计信息(类加载信息,垃圾回收信息,JIT编译信息等) - jmap
导出镜像文件
jmap -dump:live,format=b,file=outofmemory.hprof 6448
导出镜像文件后用dump分析工具比如MAT分析具体原因。那么,在生产上我们想知道是哪个进程导致内存飙高了,并且要把这个进程的内存镜像文件DUMP出来应该怎么做呢?
JSTACK工具
- top 命令
这里需要提醒大家的一点是top命令是Linux系统的命令,这个不同于JDK自带的jps系列,这个在Linux可以查看内存使用情况,定位到哪个服务进程占用CPU过高。
- JSATCK命令
针对某个CPU占用过高的服务进程,使用JSTACK查看或者重定向DUMP文件。
- 查看服务进程中的线程
top -bn1 -H -p 29068
- 假设是线程29082 CPU占用过高
因为thread id在栈信息中是以十六进制的形式显示的,所以我们要对29082线程做下16进制转换
printf “%x \n” 29082
转换后再dump中进行查找
jstack 29068|grep 0x719a -A -10
总结
因为没有进行内存泄漏及溢出的模拟,所以看不出来到底那块代码有问题,这个必须在多个时间段提出多个 Thread Dump信息,然后综合进行对比分析,单独分析一个文件是没有意义的。
作者:select you from me
来源:CSDN
转载请联系作者获得授权并注明出处。