Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Diagnosing Memory Leaks in Java

DZone's Guide to

Diagnosing Memory Leaks in Java

Every time I suspect a memory leak, I have to go dig up these commands. So, here they are for posterity's sake.

· Java Zone
Free Resource

Learn how to troubleshoot and diagnose some of the most common performance issues in Java today. Brought to you in partnership with AppDynamics.

Every time I suspect a memory leak, I have to go dig up these commands. So, here they are for posterity's sake:

First, I use the following command to monitor the process over time:

while ( sleep 1 ) ; do ps -p $PID -o %cpu,%mem,rss  ; done

(and/or New Relic if you have it ;) 

If you see memory creeping up, it could be your VM settings. If you haven't explicitly specified memory settings to the JVM, it will default them. To get the defaults, use the following command: 

java -XX:+PrintFlagsFinal -version | grep -i HeapSize

If those are out of line with what you want, then you'll need to specify the memory settings for the JVM. You can set minimum and maximum heap sizes with the following: 

java -Xms128m -Xmx256m

Once you have sane memory settings, and you can monitor the process, you might legitimately still see memory increasing over time. To get insight into that, you can start by taking a look at the histogram of object instances using the following: 

jmap -histo $PID

If that isn't enough information then you can take heap dumps with the following command: 

jmap -dump:format=b,file=/tmp/dump1.hprof $PID

Typically, I'd take two heap dumps and then compare them using jhat using the following command: 

jhat -baseline /tmp/dump1.hprof /tmp/dump2.hprof

That fires up an HTTP server that you can use to explore the delta between those two heap dumps. By default, the HTTP server will start on port 7000, which you can just hit in a browser. 

If you are behind a firewall, but have ssh access, you can tunnel over to the port using:

ssh -L 7000:localhost:7000 $HOST

If you scroll down to the bottom of the first page, you will see two useful links: 

That will show you all "new" instances between the different heaps, which should give you some idea of where your leak is coming from. Screenshot below:

Image title

And there you have it, a quick synopsis of the magic command-lines you need when diagnosing memory leaks (which I always forget).

Understand the needs and benefits around implementing the right monitoring solution for a growing containerized market. Brought to you in partnership with AppDynamics.

Topics:
java ,memory leaks ,diagnostics ,performance

Published at DZone with permission of Brian ONeill. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}