¿Cómo establecer el uso máximo de memoria para JVM?

Respuestas:

94

usa los argumentos -Xms<memory> -Xmx<memory>. Use Mo Gdespués de los números para indicar Megs y Gigs de bytes respectivamente. -Xmsindica el mínimo y -Xmxel máximo.

Prabhu R
fuente
1
es posible que desee ver MaxPermSize también.
urmalp
89
él está preguntando sobre la memoria JVM. Lo que has dicho es el tamaño del montón. Ambos son diferentes
vsingh
8
Para repetir lo que mencionan los otros comentarios, Xms y Xmx solo configuran el montón. Aunque la configuración de estas variables tiene un efecto indirecto en el espacio que no es el montón, la persona que hace la pregunta está tratando de establecer si hay una manera de configurar el uso de memoria total (montón + no montón)
murungu
2
uhu así que configuré -Xmx524My el proceso toma 1.2 GB de RAM. (?)
phil294
77
Esta no es la respuesta correcta, las opciones -Xms y -Xmx solo regulan el tamaño del almacenamiento dinámico jvm, no la asignación de memoria total.
Peter De Winter
31

No debería tener que preocuparse por la pérdida de memoria de la pila (es muy poco frecuente). La única vez que puede hacer que la pila se salga de control es con una recursión infinita (o realmente profunda).

Esto es solo el montón. Lo sentimos, no leí tu pregunta por completo al principio.

Debe ejecutar la JVM con el siguiente argumento de línea de comando.

-Xmx<ammount of memory>

Ejemplo:

-Xmx1024m

Eso permitirá un máximo de 1 GB de memoria para la JVM.

jjnguy
fuente
1
Eso no es cierto, de acuerdo con este hilo, hay varias formas en que puede filtrarse fuera del montón stackoverflow.com/questions/1475290/…
erotsppa
Tiene razón, hay muchas maneras de tener problemas de memoria que no están relacionados con la pila. Sin embargo, no son muy comunes.
jjnguy
9
Estoy bastante seguro de que no puedes controlar el tamaño de la memoria que no es del montón, ¿verdad?
mate b
Estoy bastante seguro de que puedes controlarlo a través de -XX:MaxDirectMemorySize. No es que me haya perfilado mucho para asegurarme, pero aún así;)
alexandergunnarson
2
@alexandergunnarson El MaxDirectMemorySizeúnico afecta a los buffers NIO. JVM utiliza todo tipo de otra memoria nativa.
Christopher Schultz
16

Si desea limitar la memoria para jvm (no el tamaño de almacenamiento dinámico) ulimit -v

Para tener una idea de la diferencia entre jvm y memoria de almacenamiento dinámico, eche un vistazo a este excelente artículo http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- java-process.html

vsingh
fuente
8
¿Es ulimitun comando de Linux? Hice una búsqueda rápida en Google y no vi ninguna relación entre ulimity la JVM. Y
Sam
11

La respuesta anterior es correcta, no puede controlar con gracia cuánta memoria nativa asigna un proceso Java. Depende de lo que esté haciendo su aplicación.

Dicho esto, dependiendo de la plataforma, es posible que pueda utilizar algún mecanismo, ulimit, por ejemplo, para limitar el tamaño de un Java o cualquier otro proceso.

Simplemente no esperes que falle con gracia si alcanza ese límite. Las fallas de asignación de memoria nativa son mucho más difíciles de manejar que las fallas de asignación en el montón de Java. Existe una posibilidad bastante buena de que la aplicación se bloquee, pero dependiendo de cuán crítico sea para el sistema mantener el tamaño del proceso bajo que aún podría adaptarse a usted.

SmoothieMonster
fuente
1

NativeHeap se puede aumentar en -XX: MaxDirectMemorySize = 256M (el valor predeterminado es 128)

Nunca lo he usado. Quizás lo encuentres útil.

Mario Trucco
fuente
1
Dudo que op quisiera esto: la memoria nativa se usa cuando realiza una llamada al código C / C ++ desde java.
om-nom-nom
66
la memoria nativa también se usa al hacer llamadas nio si asigna las memorias intermedias con memoria directa. (... y cargadores de clase, e información de hilo ...)
estu