Java内存分析

java heap是分配给实例类和数组对象运行数据区,所有java线程在运行期间共享heap中的数据。java heap dump相当于java应用在运行的时候在某一个时间点上打了一个快照。

1、触发thread dump

kill -QUIT java_pid 或者 kill -3 java_pid

2、jstat

使用jstat工具可以查看运行的java应用的heap size、perm size、survivor ratio等信息。例如jstat -gcutil pid 1000 5。1000是每隔1000ms取一次样本,缺省时间单位是ms,可以设置成s。5是取5次样本。-gcutil是统计垃圾回收的总体情况。

3、触发Java heap dump

  • 使用jmap -dump触发。jmap -dump:format=b,file=filename java_pid。Dump contents of the heap into a binary file for analysis。
  • 使用jconsole。到MBean>com.sun.management>HotSpotDiagnostic>操作>dumpHeap中,点击 dumpHeap按钮。生成的dump文件在java应用的根目录下面。
  • 在应用启动时配置相关的参数。-XX:+HeapDumpOnOutOfMemoryError,当应用OOM的时候生成dump文件。
  • 使用hprof。启动虚拟机的时候加入-Xrunhprof:head=site,会生成java.hprof.txt文件。这个配置会影响虚拟机运行,不要在线上运行。

4、分析Java heap dump

  • 使用IBM的HeapAnalyzer。下载后是一个haNNN.jar包。java -Xmx521m -jar haNNN.jar /path/to/heap.dump.out
  • jhat是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来。jhat -J-Xmx512m path/to/dump.out
  • EclipseMemoryAnalyzer

在socket、nio中,有一些内存是直接向操作系统申请的,这部分在堆内存中是看不到的。可以通过-XX:MaxDirectMemorySize=Number来设置这部分内存的最大空间。

posted @ 2016-08-23 19:55  我的娃会叫爸爸啦  阅读(1638)  评论(0编辑  收藏  举报