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:
And there you have it, a quick synopsis of the magic command-lines you need when diagnosing memory leaks. (which I always forget)
No comments:
Post a Comment