How to get a thread and heap dump of a Java process on Windows that's not running in a console
I have a Java application that I run from a console which in turn executes an another Java process. I want to get a thread/heap dump of that child process.
On Unix, I could do a kill -3 <pid>
but on Windows AFAIK the only way to get a thread dump is Ctrl-Break in the console. But that only gives me the dump of the parent process, not the child.
Is there another way to get that heap dump?
Solution 1:
You can use jmap
to get a dump of any process running, assuming you know the pid
.
Use Task Manager or Resource Monitor to get the pid
. Then
jmap -dump:format=b,file=cheap.hprof <pid>
to get the heap for that process.
Solution 2:
You are confusing two different java dumps. kill -3
generates a thread dump, not a heap dump.
Thread dump = stack traces for each thread in the JVM output to stdout as text.
Heap dump = memory contents for the JVM process output to a binary file.
To take a thread dump on Windows, CTRL+BREAK if your JVM is the foreground process is the simplest way. If you have a unix-like shell on Windows like Cygwin or MobaXterm, you can use kill -3 {pid}
like you can in Unix.
To take a thread dump in Unix, CTRL+C if your JVM is the foreground process or kill -3 {pid}
will work as long as you get the right PID for the JVM.
With either platform, Java comes with several utilities that can help. For thread dumps, jstack {pid}
is your best bet. http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
Just to finish the dump question out: Heap dumps are not commonly used because they are difficult to interpret. But, they have a lot of useful information in them if you know where/how to look at them. The most common usage is to locate memory leaks. It is a good practice to set the -D
on the java command-line so that the heap dump is generated automatically upon an OutOfMemoryError, -XX:+HeapDumpOnOutOfMemoryError
But, you can manually trigger a heap dump, also. The most common way is to use the java utility jmap
.
NOTE: this utility is not available on all platforms. As of JDK 1.6, jmap
is available on Windows.
An example command-line would look something like
jmap -dump:file=myheap.bin {pid of the JVM}
The output "myheap.bin" is not human readable (for most of us), and you will need a tool to analyze it. My preference is MAT. http://www.eclipse.org/mat/