Quando si esegue un'app Java (in YARN) con il rilevamento memoria nativa abilitato (-XX:NativeMemoryTracking=detail
, vedere https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html e https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html), è possibile visualizzare la quantità di memoria utilizzata dalla JVM in diverse categorie.Perché una JVM segnala più memoria impegnata rispetto alla dimensione impostata residente del processo linux?
mia app JDK 1.8.0_45 spettacoli:
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)
Questo dimostra 2.7GB di memoria impegnata, tra 1,3 GB di heap allocata e quasi 1,2 GB di stack di thread allocati (usando molti fili).
Tuttavia, quando è in esecuzione ps ax -o pid,rss | grep <mypid>
o top
mostra solo 1,6 GB di memoria residente RES/rss
. Controllo di swap dice che nessuno è in uso:
free -m total used free shared buffers cached Mem: 129180 99348 29831 0 2689 73024 -/+ buffers/cache: 23633 105546 Swap: 15624 0 15624
Perché la JVM indicano la memoria 2.7GB viene commesso quando solo 1,6 GB di residenza? Dove sono finiti gli altri?
possibile duplicato di [Le tracce RSS sono riservate o memorizzate?] (Http://stackoverflow.com/questions/31071019/does-rss-tracks-reserved-or-commited-memory) – the8472
no. questa domanda e risposta trattano la memoria riservata ma non impegnata, oltre a dire che la differenza tra lo scambio commesso e quello residente è che non ho notato il caso qui. –
la risposta copre anche le differenze tra commesso e residente. – the8472