Estoy ejecutando una aplicación Java en contenedores en Kubernetes.
Con el fin de hacer la reserva de memoria JVM de acuerdo con las especificaciones del envase, las banderas -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
se deben establecer.
Si ambas banderas se establecen junto con Xms y banderas Xmx, ¿cuál sería el comportamiento de la JVM ser? Realice una bandera sobrescribir el otro?
Por ejemplo, si tuviéramos java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xms -Xms2500M -Xmx2500M -jar myjar.jar
en una vaina con los límites de contenedores 4Gi para solicitudes y respuestas para 4Gi, en una máquina host que tiene memoria 128Gi, la cantidad de memoria haría la reserva JVM?
La bandera -Xmx sobrescribe el -XX: + bandera UseCGroupMemoryLimitForHeap.
La bandera -XX: + UseCGroupMemoryLimitForHeap permite la JVM detectar cuál es el tamaño máximo de almacenamiento dinámico en un recipiente debe ser.
La bandera -Xmx establecer el tamaño máximo de almacenamiento dinámico a un tamaño fijo.
Para responder a su ejemplo, la JVM se reservará espacio 2500M montón. Habrá un poco de uso de memoria adicional para no montón y cosas JVM.
Para ajustar aún más el uso de la memoria en un contenedor que podría utilizar el -XX: bandera MaxRAMFraction. Ver este artículo: https://blog.csanchez.org/2017/05/31/running-a-jvm-in-a-container-without-getting-killed/