2009-06-23 26 views
21

Tengo una aplicación de Java que usa aproximadamente 15G en una máquina con 16G. No sé si debería establecer el tamaño máximo de almacenamiento dinámico.Aplicación de Java que usa mucha memoria. Use -Xmx?

Si conjunto va a comer la JVM toda la RAM hasta el límite y luego comenzar a recoger la basura y dejar todo mientras se agita a través 15G de los objetos del montón?

Si no, el jvm dañará el rendimiento al no usar todo el ram disponible en la máquina.

Mi vm específico es: Java HotSpot (TM) de 64 bits del servidor VM (build 1.6.0_03-b05, modo mixto).

Gracias

+1

Me conformé con -Xms2G -Xmx14G -XX: + UseConcMarkSweepGC por el momento. –

Respuesta

18

-Xmx15G se establecer el tamaño máximo del montón a 15 concierto. Java solo asignará lo que necesita mientras se ejecuta. Si no lo configura, solo usará el predeterminado. Para obtener información sobre el valor predeterminado, consulte this post.

-Xms15G establece el montón mínima para 15 concierto. Esto obliga a Java a asignar 15 gigas de espacio en el montón antes de que comience a ejecutarse, ya sea que lo necesite o no.

Por lo general, se puede establecer que ambos valores apropiados dependiendo de cómo se está sintonizando la JVM.

+0

He descubierto que incluso si establece el mínimo, a menudo no usará esa memoria correctamente y realizará GC menores antes de alcanzar el mínimo. –

+0

@ Peter El proceso de Java lo asignará, pero la JVM podría no usarlo. No sé acerca de la heurística del GC, pero es libre de ejecutar cada vez que hay objetos para recoger. Considere cuando Xms == Xmx, esperaría que el uso del montón nunca coincidiera con Xms. Xms es la cantidad de 'mallocs' de Java del sistema operativo, nada que ver con cómo la aplicación que se ejecuta en la JVM utiliza el montón. – Cogsy

+0

Hay una cosa más para agregar si está usando strings -XX: + UseConMarkSweepGC realmente ayudará a acelerar la recolección en una máquina multi-core si hay suficientes recursos disponibles. Además, las cadenas realmente pueden consumir memoria, ya que es probable que se promocionen rápidamente a la generación anterior. –

0

Si no se establece un tamaño máximo de almacenamiento dinámico (con -Xmx), no es el máximo predeterminado solamente 64MB?

Así que no va a fallar con su aplicación OutOfMemoryError s si no se establece? Estoy confundido con esta pregunta. ¿Cómo puede funcionar su aplicación sin este interruptor?

+0

He estado corriendo con -Xmx 15G y funciona bien. Me preguntaba si hay un golpe de rendimiento al decirle al jvm que tiene 15G para jugar. ¿Completará felizmente el 15G y luego tomará curving por siempre? Además, no estoy seguro de cuánto usa la aplicación porque está creciendo a 15G cuando tengo -Xmx 15G. –

+0

¿Estás seguro de que en realidad necesitas un tamaño de almacenamiento dinámico de 15 GB y que no es solo una loca pérdida de memoria fuera de control? –

+0

Gracias por responder. No es realmente un problema de memoria en el que estoy pensando, es un problema de rendimiento. No estoy obteniendo OutOfMemoryError's. Estoy tratando de averiguar si debería dejarle a la JVM la mejor estrategia de memoria o si debería ayudarlo un poco. –

12

En Java 6, el tamaño máximo de almacenamiento dinámico predeterminado está determinado por la cantidad de memoria del sistema presente.

Según la página Garbage Collector Ergonomics, el tamaño máximo del montón es:

más pequeño de 1/cuarto de la memoria física o 1 GB. Antes de J2SE 5.0, el tamaño de almacenamiento máximo predeterminado de era de 64 MB.

Al usar el interruptor -Xmx se puede usar para cambiar el tamaño máximo de pila. Consulte la documentación de java - the Java application launcher para conocer los detalles de uso.

+2

Tenga en cuenta que lo anterior solo es cierto para las máquinas de "clase de servidor". Para Java SE 6, esta es una máquina con al menos 2 CPU y al menos 2 GB de memoria física (según http://download.oracle.com/javase/6/docs/technotes/guides/vm/server-class.html) –

Cuestiones relacionadas