2008-09-19 16 views
5

Tenemos un programa Java que requiere una gran cantidad de espacio de almacenamiento dinámico - empezamos con (entre otros argumentos de línea de comandos) el argumento -Xmx1500m, que especifica un espacio de almacenamiento dinámico máximo de 1500 MEGABYTE. Al iniciar este programa en un cuadro de Windows XP que se ha reiniciado recientemente, se iniciará y se ejecutará sin problemas. Pero si el programa se ha ejecutado varias veces, el ordenador ha estado funcionando durante un tiempo, etc., cuando se trata de iniciar me sale este error:herramientas para ver/resolver Windows XP fragmentación de la memoria

 
Error occurred during initialization of VM 
Could not reserve enough space for object heap 
Could not create the Java virtual machine. 

Sospecho que el propio Windows sufre de fragmentación de la memoria, pero No sé cómo confirmar esta sospecha. En el momento en que esto ocurre, Task Manager y sysinternals procexp informan 2000 MB de memoria libre. He mirado this question related to internal fragmentation

Así que la primera pregunta es: ¿Cómo puedo confirmar mi sospecha? La segunda pregunta es, si mis sospechas son correctas, ¿alguien sabe de alguna herramienta para resolver este problema? He buscado bastante, pero no he encontrado nada que me ayude, aparte de los reinicios periódicos de la máquina.

ps - cambiar los sistemas operativos tampoco es actualmente una opción viable.

Respuesta

2

De acuerdo con Torlack, mucho de esto se debe a que otras DLL se están cargando y entran en ciertos lugares, dividiendo la cantidad de memoria que puede obtener para la VM en una gran porción.

Puede hacer algún trabajo en WinXP si usted tiene más de 3G de la memoria para conseguir algunas de las cosas ventanas se movieron alrededor, mira hacia arriba PAE aquí: http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx

Su mejor apuesta, si realmente se necesita más de 1.2G de memoria para su aplicación java, es mirar las ventanas de 64 bits o Linux o OSX. Si está utilizando cualquier tipo de biblioteca nativa con su aplicación, tendrá que recompilarla para 64 bits, pero será mucho más fácil que tratar de volver a crear bases de datos y cosas para maximizar la memoria que puede obtener en ventanas de 32 bits. .

Otra opción sería dividir su programa en varias máquinas virtuales y hacer que se comuniquen entre sí a través de RMI o mensajería o algo así. De esta forma, cada máquina virtual puede tener un subconjunto de la memoria que necesita. Sin saber lo que hace tu aplicación, no estoy seguro de que esto ayude de ninguna manera, aunque ...

0

Usando Minimem (http://minimem.kerkia.net/) para que la aplicación pueda arreglar el problema. Sin embargo, no estoy seguro de que esta sea la respuesta que estás buscando. Espero que ayude.

0

tal vez debería considerar para iniciar el programa y la reserva de la memoria y no poner fin a la máquina virtual después de cada carrera. Busque diferentes opciones de GC y libere sus objetos.

2

menos que esté ejecutando de página del espacio de archivos, este problema no es que el equipo se está quedando sin memoria. El objetivo de la memoria virtual es permitir que los procesos usen más memoria virtual de la que está físicamente disponible.

Sin saber cómo la JVM maneja el montón, es un poco difícil decir exactamente cuál es el problema, pero uno de los problemas más comunes es que no hay suficiente espacio libre de direcciones contiguas en el proceso para permitir el montón para ser ampliado. Por qué esto sería un problema después de que la máquina ha estado funcionando un tiempo es un poco confuso.

He estado trabajando en un problema similar en el trabajo. Descubrí que la ejecución del programa con WinDBG y el uso de los comandos "! Address" y "! Address-summary" han sido invaluables para rastrear por qué el espacio de direcciones virtuales de un proceso se ha fragmentado. También puede intentar ejecutar el programa después de reiniciar y usar el comando "! Address" para tomar una fotografía del espacio de direcciones y luego hacer lo mismo cuando el programa ya no se ejecuta. Esto podría darte una pista sobre el problema. Tal vez algo tan simple como una DLL extra al cargarse pueda causar el problema.

2

Sospecho que el problema es la fragmentación de la memoria de Windows. Hay otra pregunta aquí en StackOverflow llamada Java Maximum Memory on Windows XP que menciona el uso de Process Explorer para ver dónde se asignan las DLL en la memoria y luego para solucionar el problema al volver a establecer la base de las DLL para que se cargue en la memoria de una manera más compacta.

0

Use vmmap de las herramientas SysInternals de Microsoft para ver la fragmentación del espacio de direcciones virtuales, e identifique qué está dividiendo el espacio

Cuestiones relacionadas