如何主动dump内存快照(非内存溢出时)

Java 发表评论

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
chenk818 写道
那PermGen能监控吗?看用法只区分了堆和非堆

可以找出PermGen对应MemoryPoolMXBean然后针对它来设置usage
threshold。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *