Consumo de memoria JVM

9

Estoy tratando de ejecutar tomcat en un sistema con poca memoria (150-256Mb). Aunque inicio la JVM con -Xmx64m (que debería ser el valor predeterminado de todos modos), el proceso inmediatamente toma 200Mb +.

Me pregunto por qué la JVM necesita tanta memoria en sí misma, o si hay una forma de ajustar esto. ¿Son otras JVM mejores que la Sun para un bajo consumo de memoria? ¿Funcionan con Tomcat?

Draemon
fuente

Respuestas:

5

Además del montón (especificado por -Xmsy -Xmx), debe incluir las áreas que no son del montón. Éstas incluyen

  • Perm Gen, que tiene 64 MB en sistemas de 32 bits, y 96 MB en sistemas de 64 bits inicialmente
  • El caché de código, que está entre 20 y 40 mb dependiendo de JVM
  • El área de almacenamiento intermedio NIO (de donde DirectByteBufferse extraen los s), esto es inicialmente 64mb

También está el espacio de trabajo de la propia JVM, que será de unas pocas docenas de mb.

También debe tener en cuenta el tamaño automático de Sun JVM cuando utiliza una máquina de clase de servidor . Con el tiempo, la definición de clase de servidor (memoria de 2 Gb, más de un núcleo) ha sufrido cierta depreciación y ahora la mayoría de las máquinas son capaces de activar las -serveroptimizaciones. Mi consejo es siempre para especificar las -Xmsy los -Xmxajustes y pasar -servera menos que usted puede pensar en una buena razón para no demasiado.

Dave Cheney
fuente
Tenga cuidado también con la memoria virtual que JVM solo reserva y que aún no utiliza.
Steve Schnepp
Es cierto que la mayoría de estos segmentos, como PermGen y Code Cache, se asignan al inicio, pero la mayoría de los núcleos evitarán asignar páginas a esos segmentos hasta que se necesiten.
Dave Cheney
1
Gracias por la información. Creo que esto explica hacia dónde va la memoria. ¿Hay alguna forma de cambiar estos valores? Aún mejor sería una forma de ver cuánto de cada sección estaba en uso: no sé si alguna de las herramientas de depuración / monitoreo de Java le permite hacer esto.
Draemon
1
Puede usar pmap o jmap para tener una idea sobre los diversos segmentos en uso. La mayoría de las opciones comunes (y sus valores predeterminados) se enumeran aquí, java.sun.com/javase/technologies/hotspot/vmoptions.jsp . Cambian a menudo y están sujetos a diferencias en el sistema operativo (tamaño de pila generalmente) y el arco (los sistemas operativos de 64 bits generalmente implican áreas JVM más grandes)
Dave Cheney
3

Con la opción -Xmx, restringe el tamaño del montón que reserva la JVM ... Hay recursos adicionales que necesita la JVM ...

"Gracias por la memoria" * es un buen artículo que explica cómo una JVM usa memoria ...

Aparte de eso, podría probar JVM de IBM, debería funcionar con Tomcat, no sé si algunas de las implementaciones gratuitas de JVM funcionan.

Sin embargo, no creo que una máquina con poca memoria te sirva de nada. Java solo necesita memoria.

* Como los nuevos usuarios no pueden enviar hipervínculos, debe buscar ese artículo usted mismo ... es el primer éxito en Google por "gracias por la memoria ibm".

dertoni
fuente
3
ibm.com/developerworks/java/library/j-nativememory-linux - Enlace al artículo "Gracias por la memoria"
StackKrish
0

Una técnica útil que he encontrado es usar el monitoreo JMX para ver exactamente cuánta memoria usa el espacio de almacenamiento dinámico frente a permgen.

Configure JMX en Tomcat como se describe aquí http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

Luego use JConsole (viene con JDK 5 o JDK 6): la etiqueta de memoria rastreará el consumo de memoria con el tiempo.

Además, tenga cuidado con los reinicios suaves de aplicaciones web. Si vuelve a cargar una aplicación web, el espacio permgen no se recogerá y se acumulará con el tiempo. Debes hacer una parada / inicio completo de Tomcat para recuperar el espacio permgen.

Will Glass
fuente
VisualVM también se puede usar en lugar de JConsole y dar aún más detalles cuando se buscan problemas de memoria dentro de la JVM. He tenido que usar esto en más de una ocasión para encontrar problemas.
Jeremy Bouse el