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?
相关问题
- Delete Messages from a Topic in Apache Kafka
- Jackson Deserialization not calling deserialize on
- How to maintain order of key-value in DataFrame sa
- StackExchange API - Deserialize Date in JSON Respo
- Difference between Types.INTEGER and Types.NULL in
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.
jProfiler (ej-technologies) can do this.
I suggest a 3rd-party profiler such as YourKit, which may allow you to take snapshots without kicking off the GC first. Added bonus, you can take a snapshot without the whole ctrl-break shenanigans.
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.
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 !