usada subir produccion por para mucha memoria java_opts consume configurar configuracion tomcat memory-management java-8

produccion - subir memoria a tomcat



¿Debo configurar un MaxMetaspaceSize? (3)

Como comenté en la respuesta anterior, las razones para establecer un límite en esos grupos de memoria son diferentes.

Si sus usuarios aumentaron previamente MaxPermSize por encima del valor predeterminado, probablemente sea para evitar GC completos / fallas de modo concurrente con CMS o porque sus aplicaciones realmente necesitan mucho espacio de memoria permanente.

Disminuir el límite del metaespacio de su predeterminado efectivamente infinito tendría un propósito completamente diferente: evitar el crecimiento ilimitado del metaespacio.

El caso es que eso es solo un límite superior. El tamaño realmente comprometido, es decir, el metaespacio actual será más pequeño. De hecho, hay una configuración llamada MaxMetaspaceFreeRatio (por defecto 70%) lo que significa que el tamaño real del metaespacio nunca superará el 230% de su ocupación.

Y para que crezca primero tendría que llenarse, forzando una recolección de basura (metaespacio completo) en un intento de liberar objetos y solo cuando no pueda alcanzar su MinMetaspaceFreeRatio (predeterminado 40%) expandiría el metaespacio actual a no más más del 230% de la ocupación después del ciclo GC.

Por lo tanto, en la práctica, el tamaño real del metaespacio debería estabilizarse dentro de una banda cercana a su necesidad real, a menos que la aplicación presente fugas continuas en los clasificadores / clases o genere una enorme cantidad de código dinámico.

TL; DR: Puede haber razones para restringir el tamaño del metaspace, pero es probable que sean diferentes a las razones originales para establecer los tamaños de gen de perm. Por lo tanto, la necesidad debe ser reevaluada.

Entonces, después de hacer esta pregunta, rápidamente quedó claro que la pregunta importante no era "¿cómo puedo", sino "debería hacerlo"?

Tenemos clientes que nos movemos de Java7 a Java8 (usando Tomcat7). Java7 requiere configurar MaxPermSize , y algunos clientes han aumentado su máximo por encima del predeterminado establecido por el instalador debido a las necesidades y usos individuales.

¿Debo configurar el --XX:MaxMetaspaceSize (a la -XX:MaxPermSize anterior -XX:MaxPermSize ) para los clientes que han definido un máximo personalizado? ¿Qué hay de las nuevas instalaciones? ¿Deberíamos establecer --XX:MaxMetaspaceSize en absoluto?

¿Cuáles son los pros y los contras de tal decisión?


Respuesta de @eckes comentarios:

establecería un máximo que es lo suficientemente grande como para no disparar en situaciones normales. La razón por la que digo esto es que un sistema puede actuar de forma muy errática y difícil de controlar si la memoria nativa se agota o si se produce un intercambio salvaje. Mich peor que una congelación OOM o Java. Por ejemplo, utilizando 2 GB (considerando que un sistema tenga búferes de 2 GB gratis al mínimo)


Solo para transmitir la opinión contraria, se puede hacer el caso de establecer SIEMPRE el MaxMetaspaceSize. Agrupar todo el conjunto de aplicaciones del mundo en 10 grupos (binarios, piénselo) permite una discusión de por qué. Sin embargo, recuerde que establecer el límite solo controla cuándo se producirá la recolección de basura (GC) de ese espacio.

Grupo 01: Aplicaciones con todas las clases no dinámicas

Este grupo te coloca en la banda estabilizada mencionada anteriormente. En este caso, el tamaño para establecer es bastante fácil de determinar (al igual que MaxPermSize) y de todos modos no habrá mucho GC.

Grupo 10: Aplicaciones con clases dinámicas

Dada la proliferación de bibliotecas de terceros altamente poderosas, ¿no es así casi todas las aplicaciones en este grupo? A menudo no te importa si la biblioteca es Scala / Groovy / etc, simplemente hace exactamente lo que quieres para que se use. ¿Cuál es el valor de llenar Metaspace con la camada de clases muertas (dinámicas)? Cuando GC llegue, será costoso. Preferiría limitar el tamaño, hacer que el GC sea más frecuente (pero con menos tiempo de pausa para cada uno) y ejecutar más fácilmente múltiples aplicaciones en el mismo hardware sin tener preocupaciones sobre la coincidencia de sus metaspaces individuales.