NgeBlog

Free Java Profiling Tools

July 15, 2008 · Leave a Comment

Finding a memory leak in a Java application can be one of the more difficult tasks a Java developer has to handle. The Java virtual machine effectively manages most of the memory an application uses so a ‘memory leak’ is really down to a reference that can’t be recovered due to a variety of reasons. These leaks are often small and take a while to show up in your application.

To simply see what the JVM is doing with its memory management and see a leak in progress you can use one of the following options to the JVM

java ­-XX:+ PrintGCDetails
java ­-verbose:gc
jmap ­-heap or ­jmap -histo (JDK 5.0)

For example:

[#]$ jmap ­-histo 362
Attaching to process ID 362, please wait… …
Object Histogram:
Size Count Class description ­
149232 167 char[]
34160 14 byte[]
8352 29 * ObjArrayKlassKlass
7600 203 java.lang.Object[]
3792 158 java.lang.String
3696 42 java.lang.Class
2360 23 * ConstMethodKlass

and also

jmap ­-heap
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 67108864 (64.0MB)
NewSize = 655360 (0.625MB)
MaxNewSize = 4294901760 (4095.9375MB)
OldSize = 1441792 (1.375MB)
NewRatio = 12 SurvivorRatio = 8
PermSize = 8388608 (8.0MB) MaxPermSize = 67108864 (64.0MB)

For a graphical representation of memory use there are 3 tools. HAT, jconsole and visualgc

HAT or heap analyis tools is available from java.net

First create a profiling output, this file is generated when the application ends or ctrl-c is pressed.

java -agentlib:hprof=heap=all,format=b

This then creates a java.hprof file. Supply this file as an option to hat

hat java.hprof

Then point your browser to localhost:7000. hat starts a mini http server for you to browser the profiling output

jconsole is available in the JDK 5.0 bin directory. You start your application with jmx management enabled

java -Dcom.sun.management.jmxremote

Then simply launch jconsole, it will ask you which jvm to attach to.

visualgc comes in a package called jvmstat from java.net to run it you need to execute bin/visualgc and supply the process (or jvm identifier) and and interval or use the default of 500ms

Categories: Java · Tip & Trik

0 responses so far ↓

  • There are no comments yet...Kick things off by filling out the form below.

Leave a Comment