0

Recently, I've been digging in to JVM heap dumps using Eclipse MAT. I like it, but the one feature that I seem to use the most is the Dominator Tree. Eclipse's example screenshot:

Eclipse Dominator Tree Sample Screenshot

Anyways, I find that a lot of the time, I usually get the most value out of just looking at that table and getting the first few entries. Since the turnaround time for getting this is:

  1. Create Heap Dump (jcmd <pid> GC.heap_dump)
  2. Download/Pull heapdump to a location (MAT isn't installed on our servers)
  3. Run Eclipse MAT's ParseHeapDump.sh tool to build the various trees
  4. Open MAT, click Dominator Tree icon.
  5. Analyze

Is there a way to get this equivalent information off of a running JVM programmatically? I'd like to run some kind of gather_dominators.sh <pid> script on a host and get the Top X Objects from a JVM, but I don't know where to start.

Nick Klauer
  • 5,893
  • 5
  • 42
  • 68

1 Answers1

2

If by "running jvm" You meant - "getting the info without doing stop-world heap-dump" then the obvious answer is: in order to do such thing without "full-scan" - the data needs to be collected throughout system life-time by tapping creation/release of each object and by maintaining the statistics. You could achieve such things by instrumentation or by using a ready-made custom agents (jol/jamm/etc). Note that many GCs are already doing similar work to collect (and print) statistics. IIRC - newer JVMs even keep track of such info within the class-metadata area (so getting statistics is instant).


On other hand - if You're fine to grab a heap-dump (which should be fine on any production system with any proper node-redundancy in place, designed for handling unavoidable Sun-JVM stop-world GC pauses), then Jhat, MAT-api, YourKit and Jol are probably Your best friends:

It is important to note that currently-existing heap-dump format loses the info about actual sizes of objects, so all tools (MAT/etc) are just trying to GUESS it properly:

HTH :)

Community
  • 1
  • 1
Vlad
  • 1,157
  • 8
  • 15