JDK本身为调试内存洩漏问题提供了比较完善的工具
先用命令jps找出要调试的jvm的进程id(jps这个命令就是ps命令前面加j列出所有正在运行的jvm的进程id)
例如jps
输出类似下面这样 java_appjar startupjar Jps Main Bootstrap
假设我们要调试的进程id是
如果只是想简单观察一下堆内存的使用情况可以用命令jmap histolive 这个命令会输出指定的jvm上当前各个Java类的实例数占用的内存大小和完整的类名虚拟机内部类的类名前面有*标记
如果想得到堆内存使用的详细情况可以用命令jmap dumpliveformat=bfile=/tmp/java_appheapbin
这样在/tmp目录下得到一个java_appheapbin文件其中保存的信息就是指定的jvm中堆内存的使用详情这个二进制文件可以用JDK附带的jhat(Java Heap Analysis Tool)来分析
jhat JXmxm /tmp/java_appheapbin
这个工具相当耗内存如果出现了OutOfMemoryException的话请加大JXmxm中指定的预留堆内存大小再试
Jhat会解析堆内存信息转储文件(上面用jmap生成的bin文件)输出大概像下面这样
lewis@mgr $ jhat JXmxm /tmp/java_appheapbin Reading from /tmp/java_appheapbin……
Dump file created Thu Sep CST Snapshot read resolving……
Resolving objects……
Chasing references expect dots……
Eliminating duplicate references……
Snapshot resolved Started HTTP server on port Server is ready
注意最后两行堆内存信息转储文件分析完毕后jhat并不会将分析结果输出为一个静态文件
为了方便查找以及在相关的类之间导航jhat会启动一个服务监听端口这时候就可以用浏览器来浏览和分析结果了在浏览器地址栏里输入
//localhost
里面的各个页面都有很多链接可以在相关的各个类及各种统计数据之间跳转还是很方便的