Get heap dump from a remote application in Java using JVisualVM

Philipp picture Philipp · Apr 7, 2009 · Viewed 28.5k times · Source

I run JVisualVM (Windows XP, Sun Java 1.6.0.13, 32 bit client VM) to monitor a distant application (Linux, Sun Java 1.6.0.07, 64 bit server VM). Before starting the actual remote application, I launch on the remote machine jstatd using an all access policy:

grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};

Then I start the actual app using the command line

 java -Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=3333 
compileTest.Main

From the client machine, I can see the distant app and monitor it. I can also make a thread dump etc. Unfortunately, the heap-dump button is grayed out.

How can I obtain a heap-dump from a remotely monitored application using JVisualVM?

I tried using jConsole. With jConsole it is possible to make a distant heap dump using the com.sun.management.HotSpotDiagnostic dumpHeap operation. I want the dump to be transferred to the client side and analyzed using the tools provided by JVisualVM. How can I do this?

Answer

Srini picture Srini · May 6, 2009

There is a way to do it!

  1. rmiregistry -J-Xbootclasspath/p:$JAVA_HOME/lib/sa-jdi.jar ( this uses port 1099)
  2. start 'jsadebugd' on the machine in which application is running: jsadebugd & (pid of JVM)
  3. On remote machine use following jmap -dump:file= :1099

  4. jhat

The above will start a web application at port 7000

All the above tools are part of JDK 1.6

All the best!