I'm trying to locate where my memory has gone for a Java process running in Linux. Someone suggested I use pmap -x
to see exactly what the memory is doing.
The output is really long but basically a good portion of it is a repeat of this:
00007fbf75f6a000 1016 - - - rwx-- [ anon ]
00007fbf76068000 12 - - - ----- [ anon ]
What exactly does this mean? Why do I have so many entries of this (4000+)?
Anon blocks are "large" blocks allocated via malloc
or mmap
-- see the manpages. As such, they have nothing to do with the Java heap (other than the fact that the entire heap should be stored in just such a block).
In my experience, thread stacks also use anon blocks. If you see a lot of anon blocks that all have the same size, and that size is 512k to 4Mb (the example below is repeated over a dozen times for a Tomcat process that I have running), that's the likely cause. Depending on the program, you may have up to a few dozen of these; if you're seeing thousands, it means you have a problem with threading.
b089f000 504K rwx-- [ anon ]
b091d000 12K ----- [ anon ]
b0920000 504K rwx-- [ anon ]
b099e000 12K ----- [ anon ]
b09a1000 504K rwx-- [ anon ]
b0a1f000 12K ----- [ anon ]
But that leaves a question: why are you using pmap to diagnose a Java memory issue?