recolector - java garbage collector how it works
Recolección de basura: ¿cómo se calcula el espacio de Eden(y los demás tamaños de generación)? (1)
¿Por qué NewSize, MaxNewSize, OldSize y PermSize son tan pequeños cuando MaxHeapSize es grande?
Los tamaños son solo tan grandes como necesitan ser. NewSize será más grande si genera más basura de corta duración (no sé cómo se configura MaxNewSize, pero generalmente es más pequeño de lo que lo configuré)
generación simultánea de barrido de marcas
Tiene la capacity
= tamaño máximo, used
= usado, free
= capacidad - usado.
ParNew mensajes en mi registro de GC, que entiendo es el GC para Eden.
Como ha notado, el nuevo espacio es pequeño, por lo que se limpia a menudo y el viejo generador es grande, por lo que se limpia muy poco o nada.
Necesito ayuda para entender cómo los números relacionados con GC que jmap
de jmap
y jstat
relacionan con la configuración que paso a Java. Estoy iniciando la aplicación (solr) con la siguiente configuración en un servidor con 16 GB de memoria:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Xms12144m -Xmx12144m -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:+UseCompressedOops
La salida de jmap
comienza:
Concurrent Mark-Sweep GC Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 12733906944 (12144.0MB) NewSize = 2686976 (2.5625MB) MaxNewSize = 130809856 (124.75MB) OldSize = 5439488 (5.1875MB) NewRatio = 4 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 176160768 (168.0MB)
¿Por qué NewSize
, MaxNewSize
, OldSize
y PermSize
tan pequeños cuando MaxHeapSize
es grande? ¿No debería NewSize + OldSize = heap size
? ¿Y no debería el tamaño del montón global aproximarse a MaxHeapSize
? ¿Por qué NewSize
es exactamente la mitad de OldSize
cuando NewRatio
está configurado en 4?
El resto de la salida de jmap
está debajo. Concuerda con lo anterior e incluye una concurrent mark-sweep generation
sección que tampoco sé cómo interpretar.
Además, los registros de GC indican que el "tamaño de superviviente deseado" es de 6.2MB, lo que también es extraño dado que entiendo -XX:SurvivorRatio=8
debería hacer que el espacio del sobreviviente sea 1/8 de NewSize
.
Finalmente, solo veo mensajes de ParNew
en mi registro de GC, que entiendo es el CG para Eden.
Heap Usage: New Generation (Eden + 1 Survivor Space): capacity = 117768192 (112.3125MB) used = 20402232 (19.45708465576172MB) free = 97365960 (92.85541534423828MB) 17.324059793666528% used Eden Space: capacity = 104726528 (99.875MB) used = 16408336 (15.648208618164062MB) free = 88318192 (84.22679138183594MB) 15.667793359863893% used From Space: capacity = 13041664 (12.4375MB) used = 3993896 (3.8088760375976562MB) free = 9047768 (8.628623962402344MB) 30.624128945508794% used To Space: capacity = 13041664 (12.4375MB) used = 0 (0.0MB) free = 13041664 (12.4375MB) 0.0% used concurrent mark-sweep generation: capacity = 12603097088 (12019.25MB) used = 7903352408 (7537.22420501709MB) free = 4699744680 (4482.02579498291MB) 62.70960505037411% used Perm Generation: capacity = 45903872 (43.77734375MB) used = 27759192 (26.473228454589844MB) free = 18144680 (17.304115295410156MB) 60.472441191889% used