Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't the -baseline option of jhat work?

How come every object appears to be marked new, instead of just objects that are in the second snapshot but not in my baseline snapshot? Looking around online, I see some suggestions that I need to use hprof instead of jmap to make my memory dumps, but it appears that hprof generates dumps in exactly the same format.

This is JDK 1.6.0_14; I have tried on both Windows and UNIX.

like image 229
skiphoppy Avatar asked Dec 22 '22 09:12

skiphoppy


1 Answers

jhat -baseline indeed won't work with dumps produced by jmap. I'm not certain, but I believe this is because hprof attaches to the JVM right from the start and keeps its own track of objects, allowing it to produce consistent IDs across multiple dumps. Don't quote me on that. Either way, the important point as far as you're concerned is that jmap dumps don't work.

However, all is not lost. Go and get the Eclipse Memory Analyzer. (If you don't use Eclipse, fear not, you can get it as a standalone executable.) It's faster than jhat, uses less memory than jhat and it can do what you want:

  1. Open dump2 (with File|Open Heap Dump). Don't bother having it create a report for you.
  2. Open dump1 (same way). Again, no report.
  3. In the tab for dump2, click "Histogram"
  4. On the right of the toolbar in the Histogram subtab is "Compare to another Heap Dump". Click it.
  5. Select dump1 from your dialog as the dump to use as the baseline.
  6. Presto, you have the differences between dump2 and the baseline dump1.

All of this works fine with a jmap dump.

like image 177
Jon Bright Avatar answered Dec 29 '22 20:12

Jon Bright