javalinuxmemorymemory-managementpmap

Trying to locate a leak! What does anon mean for pmap?


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+)?


Solution

  • 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?