Reputation: 1162
We have a long running server application running Java 5, and profiling it we can see the old generation growing slowly over time. It's correctly freed on a full GC, but I'd like to be able to look at the unreachable objects in Eclipse MAT using a heap dump. I've successfully obtained a heap dump using +XX:HeapDumpOnCtrlBreak, but the JVM always does a GC before dumping the heap. Apparently this doesn't happen on Java 6 but we're stuck on 5 for now. Is there any way to prevent this?
Upvotes: 13
Views: 16555
Reputation: 28634
use jconsole or visualvm or jmc or ... other jmx management console. open HotSpotDiagnostic in com.sun.management. select method dumpHeap and input two parameters:
false
to dump all objects.Note that the dump file will be written by the JVM you connected to, not by JVisualVM, so if the JVM is running on a different system, it will be written on that system.
Upvotes: 16
Reputation: 979
Have you tried the standard jmap tool shipped with the JDK? The jmap toll was officially introduced in Java 5.
Example command line: /java/bin/jmap -heap:format=b
The result can be processed with the standard jhat tool or with GUI applications such as MAT.
Upvotes: 4
Reputation: 58098
I have some code here that can programmatically take a heap dump over JMX:
Link: JmxHeapDumper.java
The comments in the source code contain 2 links to articles that contained useful information about how to take heap dumps. I don't know for sure but if you are in luck, perhaps the JMX approach would have some way of avoiding the GC. Hope this helps !
Upvotes: 3