Having to profile a webapp that filled the Java Heap, I wrote a simple python module that plots the size of the heap consumed by each class.
It uses the files generated by #jmap -histo $(pidof java); which tracks the memory per-class consumption.
Once you generate your files with something like:
while sleep 5; do jmap -histo $(pidof java) > /tmp/histo.$(date %s) done
You can load the jplot module included in https://github.com/ioggstream/py-jstack/.
Using ipython makes things even easier!
#git clone https://github.com/ioggstream/py-jstack/ #cd py-jstack; #ipython; ipython$ import jplot
Once you loaded the module, you have to list the files to parse
and generate a table containing the classes and their memory occupation in time
for the first 30 greedy classes.
ipython$ files = ! ls /tmp/histo.* ipython$ table = jplot.jhisto(files, limit=30, delta=False)
What does the `table` dictionary contain? A list of #instance and memory size in time
ipython$ cls = 'java.lang.String' ipython$ print(table[cls][:10]) [(452588.0, 18103520.0), # values in 1st file (186198.0, 7447920.0), # values in 2nd file (229789.0, 9191560.0), # values in 3rd file ...] ipython$ memory_for_string = zip(*table[cls])[1] ipython$ max_memory_for_string = max(memory_for_string)
Using matplotlib we can plot too, and have a glimpse of which class is misbehaving…
ipython$ jplot.plot_classes(table, limit=10)