Java 内存堆栈分析。我们在分析现网问题时候,经常会遇到一些问题从日志上无法分析的疑难问题。在我们举足无措的时候,我们可以分析一些JVM内存,来看看问题出在哪里了。
我们经常用到的一工具:
分析栈内存(stack):jstack/kill -3 + IBM Thread and Monitor Dump Analyzer for Java (点击下载)
分析堆内存(heap): jmap + jhat。
我们通常是从栈信息入手来进行分析。下面我详细介绍一下他们具体是使用方法:
jstack是java自带的一个分析工具,我们可以在java的安装目录找到:$JAVA_HOME/bin 中找到。
使用方法usage里面的介绍非常明确了,我就不去翻译啦。我这里举个例子:
我们先查询一下java进程,因为jstack要根据java进程号来打印stack信息:
ps -ef|grep java将stack信息记录到stack.out文件中: jstack -l 31155 > stack.out
我们再用BM Thread and Monitor Dump Analyzer for Java这个工具来分析。
这里可以清晰的看到线程数状态统计,和每个线程的状态。
具体的分析我们可以看看这篇文章。http://jameswxx.iteye.com/blog/1041173
jmap + jhat。这个两个命令也是java自带的,在$JAVA_HOME/bin中你也可以找到他们两个。
基本使用方法是:
先打印heap信息:jmap -dump:live,format=b,file=heap.bin
注意这个文件一般会很大。要看应用服务。使用jhat分析:jhat -J-mx1024M heap.bin
这个命令会启动一个Server服务,默认的端口是7000。其中-mx是设置最大使用多少内存,如果你要分析的heap文件很大的话,这个值要配置很大,不然会包内存异常的错误。
我们主要看这个两个部分:
Show instance counts for all classes (excluding platform)
Show heap histogram
平台外的对象信息,和对象heap树状图,这个树状图包括所有对象的个数已经占有大小,占用的大小是bytes。