2009-07-08 10 views
59

Después de la lectura ya pidió a la pregunta sobre el tema y una gran cantidad de googlear todavía no soy capaz de tener una visión clara de -Xms opciónparámetros de almacenamiento dinámico de JVM

Mi pregunta es: ¿cuál es la diferencia entre java -Xms=512m -Xmx=512m y java -Xms=64m -Xmx=512m ?

Por ahora tengo la siguiente respuesta:

La única diferencia está en el número de colecciones de basura que se ejecutarán durante la marcha de mi solicitud y el número de asignaciones de memoria. ¿Estoy en lo cierto?

Estas son mis razones para esta respuesta:

Configuración de la opción -Xms a 512m no da lugar a mi solicitud utilizando realmente 512M de memoria física después del inicio. Supongo que esto está relacionado con la administración moderna de la memoria virtual del sistema operativo y las asignaciones de páginas diferidas. (Me di cuenta de que la fijación de -Xms a 512M o para 64M no cambia en absoluto la memoria usada inicial reportado ya sea por la parte superior en Linux o por el administrador de tareas de Windows)

Alguien me puede ayudar a entender el impacto de esta Xms opción o apuntarme a enlaces que me ayudarán a entenderlo?

Gracias de antemano

Manu

Respuesta

31

Para resumir la información encontrada después del enlace: La JVM asigna la cantidad especificada por -Xms pero el sistema operativo generalmente no asigna páginas reales hasta que se necesiten. Por lo tanto, la JVM asigna la memoria virtual según lo especificado por Xms, pero solo asigna la memoria física que se necesita.

Puede ver esto utilizando Process Explorer por Sysinternals en lugar de administrador de tareas en Windows.

Por lo tanto, existe una diferencia real entre el uso de -Xms64M y -Xms512M. Pero creo que la diferencia más importante es la que ya ha señalado: el recolector de basura se ejecutará con más frecuencia si realmente necesita los 512MB pero solo comenzó con 64MB.

+12

Creo que la sintaxis real es -Xms64m y no -Xms = 64m. Si me equivoco, retroceda! – Burkhard

+1

Se encontró con esto al investigar algunos de los puntos más finos de la configuración de jvm. La respuesta aceptada aquí es muy diferente de mi comprensión de estos valores. Sí, la mayoría de los sistemas operativos solo pondrán a disposición páginas físicas cuando se produzca una falla menor en la página, ya que la aplicación intenta acceder a la memoria mallocada, pero Xms especifica la cantidad inicial de memoria mal establecida por el jvm, lo que coloca un límite superior en el número de páginas que se pueden asignar * sin * la aplicación malloc'ing más memoria - y en el caso de Java, solo malloc más memoria (hasta Xmx) si memoria insuficiente está disponible por gc – symcbean

+0

@symcbean Estoy confundido . Parece que su comprensión no es realmente diferente de lo que está en la respuesta. Simplemente estás usando palabras diferentes, pero estás describiendo exactamente el mismo comportamiento. – Turismo

4

si escribió: -Xms512m -Xmx512m cuando se inicia, java asignan en los momentos 512m de carnero para su proceso y el incremento no puede.

-Xms64m -Xmx512m cuando se inicia, java asigna solo 64m de ram para su proceso, pero java puede incrementar su ocupación de memoria a 512m.

Creo que lo segundo es mejor porque le das a java la gestión automática de la memoria.

+0

Lo sé. ¿Pero qué significa "Java asignar en esos momentos 512m" exactamente? Parece que esta memoria no está asignada de manera efectiva ya que mi sistema de 512 m de bytes puede lanzar varias otras aplicaciones sin cambiar y me informan que mi aplicación java utiliza solo algunos megabytes. –

+1

¿Por qué se modificó esta versión? Es técnicamente correcto a excepción de la última oración que puede o no ser correcta. En un mundo de alto rendimiento, generalmente es más inteligente hacer que Java asigne toda la memoria que necesitará con un solo brk(). En otras situaciones, asignar memoria a medida que la usa podría ser más inteligente. – Fredrik

+0

No bajé esta respuesta yo mismo. En cuanto a su comentario, tengo la misma pregunta que la que le pedí a dan: ¿Hay algún "riesgo" o desventaja de establecer el valor de Xms en el mismo valor que Xmx? Gracias Manu –

34

La JVM comenzará con el uso de memoria en el nivel de almacenamiento dinámico inicial. Si el maxheap es más alto, crecerá al tamaño máximo de mapeo ya que los requisitos de memoria exceden su memoria actual.

Así,

  • -Xms512m -Xmx512m

JVM se inicia con 512 M, nunca se cambia el tamaño.

  • -Xms64m -Xmx512m

JVM se inicia con el 64M, crece (hasta un máximo de techo de 512) si mem. los requisitos exceden 64.

+0

Lo sé. Pero como dije en mi comentario anterior, ¿qué significa exactamente que "Java comenzará con el uso de memoria en el nivel de montón inicial"?Esta memoria parece no estar asignada de manera efectiva ya que mi sistema de 512 m de bytes puede lanzar varias otras aplicaciones sin cambiar y me informan que mi aplicación java solo usa algunos megabytes. –

+3

Normalmente establecería el tamaño de almacenamiento dinámico inicial en un valor mayor si supiera que una aplicación en el arranque consumiría una cantidad determinada de memoria. Esto evita que la JVM tenga que tomar tiempo de ejecución al inicio para cambiar el tamaño del montón varias veces. Ese uso particular es una optimización muy común para hacer que el eclipse se ejecute más rápido al evitar el costoso ciclo de asignación. – dhable

+0

Gracias por esta respuesta que me lleva a esta otra pregunta: ¿Hay algún "riesgo" o desventaja de establecer el valor de Xms en el mismo valor que Xmx? –

5

La JVM redimensiona el montón de forma adaptativa, lo que significa que intentará encontrar el mejor tamaño de almacenamiento dinámico para su aplicación. -Xms y -Xmx simplemente especifican el rango en el que la JVM puede operar y cambiar el tamaño del montón. Si -Xms y -Xmx tienen el mismo valor, el tamaño del almacenamiento dinámico de la JVM se mantendrá constante en ese valor.

Por lo general, es mejor configurar -Xmx y dejar que la JVM encuentre el mejor tamaño de almacenamiento dinámico, a menos que haya una razón específica por la que necesite darle a la JVM un gran montón en el lanzamiento de JVM.

En cuanto a cuando la JVM realmente solicita la memoria del sistema operativo, creo que depende de la plataforma y la implementación de la JVM. Imagino que no solicitaría la memoria hasta que tu aplicación realmente la necesite. -Xmx y -Xms solo reserva la memoria.

14

Aparte de los parámetros del montón estándar -Xms y -Xmx también es bueno saber -XX:PermSize y -XX:MaxPermSize, que se utiliza para especificar el tamaño del espacio de Perm Gen porque a pesar de que podría tener el espacio en otra generación en el montón se puede quedar sin memoria si tu espacio genérico de permeabilidad se llena. Este enlace también tiene una buena visión general de algunos important JVM parameters.

0

he creado este ejemplo de juguete en scala, my_file.scala:

object MyObject { 

    def main(args: Array[String]) { 
     var ab = ArrayBuffer.empty[Int] 

     for (i <- 0 to 100 * 1000 * 1000) { 
      ab += i 
      if (i % 10000 == 0) { 
       println("On : %s".format(i)) 
      } 
     } 
    } 
} 

lo corrió con:

scala -J-Xms500m -J-Xmx7g my_file.scala 

y

scala -J-Xms7g -J-Xmx7g my_file.scala 

sin duda hay pausas notables en la versión -Xms500m. Estoy seguro de que las pausas cortas son carreras de recolección de basura, y las largas son asignaciones de pila.

Cuestiones relacionadas