JVM内存分析工具使用

703 查看

Java 内存堆栈分析。我们在分析现网问题时候,经常会遇到一些问题从日志上无法分析的疑难问题。在我们举足无措的时候,我们可以分析一些JVM内存,来看看问题出在哪里了。
我们经常用到的一工具:
分析栈内存(stack):jstack/kill -3 + IBM Thread and Monitor Dump Analyzer for Java (点击下载)
分析堆内存(heap): jmap + jhat。

我们通常是从栈信息入手来进行分析。下面我详细介绍一下他们具体是使用方法:
jstack是java自带的一个分析工具,我们可以在java的安装目录找到:$JAVA_HOME/bin 中找到。

使用方法usage里面的介绍非常明确了,我就不去翻译啦。我这里举个例子:

  1. 我们先查询一下java进程,因为jstack要根据java进程号来打印stack信息:
    ps -ef|grep java

  2. 将stack信息记录到stack.out文件中: jstack -l 31155 > stack.out

  3. 我们再用BM Thread and Monitor Dump Analyzer for Java这个工具来分析。
    这里可以清晰的看到线程数状态统计,和每个线程的状态。

具体的分析我们可以看看这篇文章。http://jameswxx.iteye.com/blog/1041173

jmap + jhat。这个两个命令也是java自带的,在$JAVA_HOME/bin中你也可以找到他们两个。
基本使用方法是:

  1. 先打印heap信息:jmap -dump:live,format=b,file=heap.bin
    注意这个文件一般会很大。要看应用服务。

  2. 使用jhat分析:jhat -J-mx1024M heap.bin
    这个命令会启动一个Server服务,默认的端口是7000。其中-mx是设置最大使用多少内存,如果你要分析的heap文件很大的话,这个值要配置很大,不然会包内存异常的错误。


我们主要看这个两个部分:
Show instance counts for all classes (excluding platform)
Show heap histogram
平台外的对象信息,和对象heap树状图,这个树状图包括所有对象的个数已经占有大小,占用的大小是bytes。