JMP - Java Memory Profiler JMP logo

users_guide [ps]
users_guide [pdf]
users_guide [lyx]

Current version: 0.51.1

Other versions jmp-0.51.1.tar.gz
jmp/0.18, gtk/1.2 

jmp.deb [0.48, i386]
jmp.deb [0.42, amd64]
jmp.deb [0.48, ppc]
jmp.dll [0.50.1]
gtk+/2.2.0 Win32

Old versions

Robert Olofsson

  Screenshot - jmp-0.51.1

The first image show what objects there are in memory.
The meaning of the columns are:
ClassThe class that has instances.
instancesThe current number of allocated instances.
max instancesThe maximum simultanious number of allocated instances.
SizeThe current number of bytes instances of this class use.
#GCThe number of instances of this class that have been garbage collected.
TenureThe average number of GCs that the instances have survived

screenshot - objects

This image shows how object connect to each other. Finding the owner to objects is the easy way to find memory leaks.
screenshot - object owners

Here we can see a summary of who it is that holds references to objects of a given class.
screenshot - object owners

This image shows the non-null links in a few objects. Using this it is quite easy to see how large the data structures are. Instances can be inspected by selecting "inspecte instance" in the right-click menu.
screenshot - instances

Strings are a common cause of high memory usage in java. So it is nice to to see if there are dupliate strings in memory. JMP can open a window that shows all strings (well, actually all the char[]) in memory so that you can see which strings that occurs multiple times.
screenshot - strings

In the next image we can see where the java program is spending time. The columns I value the most are the secs and calls. Note! The time used is real time, so if you have 10 threads and your application is running for 60 seconds you should see a total time of 600 seconds used.

The meaning of the columns are:
Class The class that holds the method.
method The method that takes time.
secs The number of seconds that this method has used.
calls The number of calls to this method.
subs sec The number of seconds that methods called from this method has taken. Recursive methods can show up big time here.
Total The sum of secs and subs secs.
Total/call The average time spend per call to this method.
objects The number of instances this method has allocated.
objects/call The average number of instances this method allocates.
bytes The number of bytes this method has allocated.

screenshot - methods

Here is a method call graph.

screenshot - methods

Here is a window showing all the threads in the system.
Name The name of the threads.
Group The group of the thread.
Parent The parent of the thread.
Contenation The time this thread has spent waiting for a monitor.
Status The current status of the thread.
Time How much time this thread has used.

Class The class of the stack trace element.
Method The method of the stack trace element.

screenshot - threads

Here is the main control window. The graph show how much memory is allocated to the java heap (pink), used heap memory (blue) and how much of that memory is used by the currently filtered set (green).
screenshot - jmp

Here you can see what types of event that can be enabled and disabled at runtime. This means that you can start jmp without tracing anything heavy and then start profiling when your application has reached a state where profiling is wanted.
screenshot - events

This is a window that shows the monitors that exists in the jvm at a given moment.
screenshot - monitors

And here we can see that jmp has detected a deadlock situation
screenshot - monitors