title: Why does a JVM report more committed memory than the linux process resident set size?
body: <p>When running a Java app (in YARN) with native memory tracking enabled (<code>-XX:NativeMemoryTracking=detail</code> see <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html" rel="noreferrer">https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html</a> and <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html" rel="noreferrer">https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html</a>), I can see how much memory the JVM is using in different categories.</p>
  
  <p>My app on jdk 1.8.0_45 shows:</p>
  
  <pre>
  Native Memory Tracking:
  
  Total: reserved=4023326KB, committed=2762382KB
  -                 Java Heap (reserved=1331200KB, committed=1331200KB)
                              (mmap: reserved=1331200KB, committed=1331200KB) 
  
  -                     Class (reserved=1108143KB, committed=64559KB)
                              (classes #8621)
                              (malloc=6319KB #17371) 
                              (mmap: reserved=1101824KB, committed=58240KB) 
  
  -                    Thread (reserved=1190668KB, committed=1190668KB)
                              (thread #1154)
                              (stack: reserved=1185284KB, committed=1185284KB)
                              (malloc=3809KB #5771) 
                              (arena=1575KB #2306)
  
  -                      Code (reserved=255744KB, committed=38384KB)
                              (malloc=6144KB #8858) 
                              (mmap: reserved=249600KB, committed=32240KB) 
  
  -                        GC (reserved=54995KB, committed=54995KB)
                              (malloc=5775KB #217) 
                              (mmap: reserved=49220KB, committed=49220KB) 
  
  -                  Compiler (reserved=267KB, committed=267KB)
                              (malloc=137KB #333) 
                              (arena=131KB #3)
  
  -                  Internal (reserved=65106KB, committed=65106KB)
                              (malloc=65074KB #29652) 
                              (mmap: reserved=32KB, committed=32KB) 
  
  -                    Symbol (reserved=13622KB, committed=13622KB)
                              (malloc=12016KB #128199) 
                              (arena=1606KB #1)
  
  -    Native Memory Tracking (reserved=3361KB, committed=3361KB)
                              (malloc=287KB #3994) 
                              (tracking overhead=3075KB)
  
  -               Arena Chunk (reserved=220KB, committed=220KB)
                              (malloc=220KB) 
  </pre>
  
  <p>This shows 2.7GB of committed memory, including 1.3GB of allocated heap and almost 1.2GB of allocated thread stacks (using many threads).</p>
  
  <p>However, when running <code>ps ax -o pid,rss | grep &lt;mypid&gt;</code> or <code>top</code> it shows only 1.6GB of <code>RES/rss</code> resident memory.  Checking swap says none in use:</p>
  
  <pre>
  free -m
               total       used       free     shared    buffers     cached
  Mem:        129180      99348      29831          0       2689      73024
  -/+ buffers/cache:      23633     105546
  Swap:        15624          0      15624
  </pre>
  
  <p>Why does the JVM indicate 2.7GB memory is committed when only 1.6GB is resident?  Where did the rest go?</p>