Pregunta

Tenemos un programa Java que requiere una gran cantidad de espacio de almacenamiento dinámico; lo iniciamos con (entre otros argumentos de la línea de comando) el argumento -Xmx1500m, que especifica un espacio de almacenamiento dinámico máximo de 1500 MB.Al iniciar este programa en un equipo con Windows XP recién reiniciado, se iniciará y se ejecutará sin problemas.Pero si el programa se ha ejecutado varias veces, el ordenador ha estado un rato encendido, etc., cuando intenta iniciar me sale este error:

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 fragmentación de memoria, pero no sé cómo confirmar esta sospecha.En el momento en que esto sucede, el administrador de tareas y el procexp de sysinternals informan que hay 2000 MB de memoria libre.he mirado Esta pregunta está relacionada con la fragmentación interna.

Entonces la primera pregunta es: ¿Cómo confirmo mi sospecha?La segunda pregunta es, si mis sospechas son correctas, ¿alguien conoce alguna herramienta para solucionar este problema?He buscado bastante, pero no encontré nada que ayude, aparte de los reinicios periódicos de la máquina.

PD: cambiar el sistema operativo tampoco es actualmente una opción viable.

¿Fue útil?

Solución

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

Puede trabajar un poco en WinXP si tiene más de 3G de memoria para mover algunas de las cosas de Windows, busque PAE aquí:http://www.microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx

Su mejor opción, si realmente necesita más de 1,2 G de memoria para su aplicación Java, es buscar Windows de 64 bits, Linux u OSX.Si está utilizando algún tipo de biblioteca nativa con su aplicación, tendrá que recompilarlas para 64 bits, pero será mucho más fácil que intentar cambiar la base de archivos DLL y demás para maximizar la memoria que puede obtener en Windows 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 esa manera, cada VM puede tener un subconjunto de la memoria que necesita.Sin saber qué hace su aplicación, no estoy seguro de que esto ayude de alguna manera...

Otros consejos

A menos que se esté quedando sin espacio para el archivo de página, este problema no es que la computadora se esté quedando sin memoria.El objetivo de la memoria virtual es permitir que los procesos utilicen más memoria virtual de la que está físicamente disponible.

Sin saber cómo maneja la JVM 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 de direcciones libre contiguo disponible en su proceso para permitir que se extienda el montón. .Por qué esto sería un problema después de que la máquina ha estado funcionando por un tiempo es un poco confuso.

He estado trabajando en un problema similar en el trabajo.Descubrí que ejecutar el programa usando WinDBG y usar 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 ejecute.Esto podría darle una pista sobre el problema.Tal vez algo simple como la carga de una DLL adicional pueda causar el problema.

Sospecho que el problema es la fragmentación de la memoria de Windows.Hay otra pregunta aquí en StackOverflow llamada Memoria máxima de Java en Windows XP eso menciona el uso de Process Explorer para ver dónde se asignan las DLL en la memoria y luego solucionar el problema reestructurando las DLL para que se carguen en la memoria de una manera más compacta.

Utilizando mínimo (http://minimem.kerkia.net/) para esa aplicación podría solucionar su problema.Sin embargo, no estoy seguro de que esta sea la respuesta que busca.Espero que ayude.

Tal vez debería considerar iniciar el programa y reservar la memoria y no terminar la VM después de cada ejecución.Busque diferentes opciones de GC y suelte sus objetos.

Utilice vmmap de las herramientas SysInternals de Microsoft para ver la fragmentación del espacio de direcciones virtuales e identificar qué está dividiendo el espacio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top