http://hllvm.group.iteye.com/group/topic/34438
如何主动dump内存快照(非内存溢出时)
richard_2010 2012-09-04
RT,我们知道在启动参数加上-XX:+HeapDumpOnOutOfMemeryError可以在内存溢出时dump出内存快照用来查找哪里产生内存溢出的故障,但是如何主动去dump正在运行JVM的内存快照呢?在没有内存溢出之前。
| |
ol_beta 2012-09-05
1.jmap 可以
引用
Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file) jmap [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: <none> to print same info as Solaris pmap -heap to print java heap summary -histo[:live] to print histogram of java object heap; if the "live" suboption is specified, only count live objects -permstat to print permanent generation statistics -finalizerinfo to print information on objects awaiting finalization -dump:<dump-options> to dump java heap in hprof binary format dump-options: live dump only live objects; if not specified, all objects in the heap are dumped. format=b binary format file=<file> dump heap to <file> Example: jmap -dump:live,format=b,file=heap.bin <pid> -F force. Use with -dump:<dump-options> <pid> or -histo to force a heap dump or histogram when <pid> does not respond. The "live" suboption is not supported in this mode. -h | -help to print this help message -J<flag> to pass <flag> directly to the runtime system 2.kill -3 杀一下jvm进程 | |
RednaxelaFX 2012-09-12
jmap -dump:format=b,file=xxx.hprof <pid>
是通常的正解吧。这会让VM接到dump请求后直接把Java heap里所有对象都dump下来,无论对象是死是活。 jmap -dump:format=b,live,file=xxx.hprof <pid> 这种则让VM在接到dump请求时先做一次full GC,然后再dump;所以已经死掉的对象刚被GC清理掉,就不会出现在dump里了。 VisualVM在连接上一个活Java进程后也有选项可以dump heap。参考这个文档: http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/applications_local.html
ol_beta 写道
2.kill -3 杀一下jvm进程
这个是不对的。kill -3(SIGQUIT)是在目标Java进程的标准输出流上输出thread dump,也就是线程列表以及每个线程的stack trace。这个信号不用来做heap dump。 kill的默认信号15(SIGTERM)也不会打heap dump。它会让Java进程执行关闭序列然后退出。关闭序列主要是shutdown hooks。 kill -9(SIGKILL)则是直接把进程杀了,JVM来不及做任何事情就被干掉,所以也不会打heap dump。 | |
richard_2010 2012-09-12
多谢ol_beta和撒迦的回复,都很有用
| |
Willam2004 2012-11-08
jvm是否有参数,在heapsize使用超过maxheap的80%时候,将内存对象dump下来?
| |
RednaxelaFX 2012-11-08
HotSpot VM的话没内建的参数实现这个功能,要自己在VM里打patch加这功能不难。
但更靠谱的是利用JMX从外部自己写个工具定时轮寻Java堆的使用情况,当超过自己关注的阈值时让自己的工具主动触发JVM做heap dump。 Java SE 7的话甚至可以不轮寻,直接用MemoryMXBean上的notification就可以方便的监控Java堆的使用状况,使用量到达设定的阈值时就会发出notification。请参考 http://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryMXBean.html 这里有例子教如何用JMX来触发heap dump,我懒得写了: http://www.java-community.de/archives/85-Java-heap-dumps.html 因为是用HotSpotDiagnosticMBean所以这代码只在HotSpot VM上有效。 | |
chenk818 2012-11-18
RednaxelaFX 写道
HotSpot VM的话没内建的参数实现这个功能,要自己在VM里打patch加这功能不难。
但更靠谱的是利用JMX从外部自己写个工具定时轮寻Java堆的使用情况,当超过自己关注的阈值时让自己的工具主动触发JVM做heap dump。 Java SE 7的话甚至可以不轮寻,直接用MemoryMXBean上的notification就可以方便的监控Java堆的使用状况,使用量到达设定的阈值时就会发出notification。请参考 http://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryMXBean.html 这里有例子教如何用JMX来触发heap dump,我懒得写了: http://www.java-community.de/archives/85-Java-heap-dumps.html 因为是用HotSpotDiagnosticMBean所以这代码只在HotSpot VM上有效。 那PermGen能监控吗?看用法只区分了堆和非堆 | |
RednaxelaFX 2012-11-21
|