Nick Stinemates
Nick Stinemates

Reputation: 44140

How do I analyze a .hprof file?

I have a production server running with the following flag: -XX:+HeapDumpOnOutOfMemoryError

Last night it generated a java-38942.hprof file when our server encountered a heap error. It turns out that the developers of the system knew of the flag but no way to get any useful information from it.

Any ideas?

Upvotes: 280

Views: 474541

Answers (10)

RAM237
RAM237

Reputation: 1035

Opening it with JProfiler helped me a lot.

Shows you the Heap Walker with all the threads, packages, classes and relations between them, so you can navigate, walk the incoming/outgoing references and visualize.

There is a plenty of guides on using it, so getting the general idea on dump analyzing should be enough to start using it.

It requires a paid license, but has 10 days of free trial.

Upvotes: 0

nswagg
nswagg

Reputation: 11

You may get some value out of the Oracle Java Platform, Standard Edition Troubleshooting guide, which details the HPROF: A Heap/CPU Profiling Tool. It can be used to receive relevant information from from the JVM, like CPU usage sampling/times and memory allocation. You can take a look into that file with the tool and glean some high-level information.

Invoking the HPROF Tool

$ java -agentlib:hprof ToBeProfiledClass
$ java -Xrunhprof[:options] ToBeProfiledClass

Obtaining Heap Allocation Profile

Shows allocation for various parts of the program

$ java -agentlib:hprof=heap=sites ToBeProfiledClass

HPROF Help

$ java -agentlib:hprof=help

The files are usually large and docs recommend JHAT for visualizing the outputs of the heap dump (Also mentioned above). Can figure out what parts of your program are eating your heap memory and maxing out CPU usage.

Upvotes: 0

Falchio
Falchio

Reputation: 606

I'm using IntelliJ IDEA profiler in Ultimate version. In IDEA, press the Shift button twice.
In Actions tab write - "profiler".
Choice row "profiler" with icon.
Then Open snapshot.. button.

Upvotes: 0

Waleed
Waleed

Reputation: 554

I personally prefer VisualVM. One of the features I like in VisualVM is heap dump comparison. When you are doing a heap dump analysis there are various ways to go about figuring out what caused the crash. One of the ways I have found useful is doing a comparison of healthy vs unhealthy heap dumps.

Following are the steps you can follow for it :

  1. Getting a heap dump of OutOfMemoryError let's call it "oome.hprof". You can get this via JVM parameter HeapDumpOnOutOfMemoryError.
  2. Restart the application let it run for a bit (minutes/hours) depending on your application. Get another heap dump while the application is still running. Let's call it "healthy.hprof".
  3. You can open both these dumps in VisualVM and do a heap dump comparison. You can do it on class or package level. This can often point you into the direction of the issue.

link : https://visualvm.github.io

Upvotes: 16

Andrejs
Andrejs

Reputation: 27677

If you want to do a custom analysis of your heapdump then there's:

This library is fast but you will need to write your analysis code in Java.

From the docs:

  • Does not create any temporary files on disk to process heap dump
  • Can work directly GZ compressed heap dumps
  • HeapPath notation

Upvotes: 9

Christian C. Salvadó
Christian C. Salvadó

Reputation: 827316

You can use JHAT, The Java Heap Analysis Tool provided by default with the JDK. It's command line but starts a web server/browser you use to examine the memory. Not the most user friendly, but at least it's already installed most places you'll go. A very useful view is the "heap histogram" link at the very bottom.

ex: jhat -port 7401 -J-Xmx4G dump.hprof

jhat can execute OQL "these days" as well (bottom link "execute OQL")

Upvotes: 91

James Schek
James Schek

Reputation: 17960

You can also use HeapWalker from the Netbeans Profiler or the Visual VM stand-alone tool. Visual VM is a good alternative to JHAT as it is stand alone, but is much easier to use than JHAT.

You need Java 6+ to fully use Visual VM.

Upvotes: 39

Polaris
Polaris

Reputation: 119

YourKit Java Profiler seems to handle them too.

Upvotes: 11

kohlerm
kohlerm

Reputation: 2624

Just get the Eclipse Memory Analyzer. There's nothing better out there and it's free.

JHAT is only usable for "toy applications"

Upvotes: 15

Cowan
Cowan

Reputation: 37543

If you want a fairly advanced tool to do some serious poking around, look at the Memory Analyzer project at Eclipse, contributed to them by SAP.

Some of what you can do is mind-blowingly good for finding memory leaks etc -- including running a form of limited SQL (OQL) against the in-memory objects, i.e.

SELECT toString(firstName) FROM com.yourcompany.somepackage.User

Totally brilliant.

Upvotes: 251

Related Questions