allocate - java stack space
Espacio en el montón de Java sin memoria (9)
¿Mantiene referencias a las variables que ya no necesita (por ejemplo, datos de las simulaciones anteriores)? Si es así, tienes una pérdida de memoria. Solo necesita encontrar dónde está sucediendo y asegurarse de eliminar las referencias a las variables cuando ya no sean necesarias (esto sucedería automáticamente si se salieran del alcance).
Si realmente necesita todos los datos de simulaciones anteriores en la memoria, necesita aumentar el tamaño del almacenamiento dinámico o cambiar su algoritmo.
Mi aplicación actualmente consume mucha memoria porque está ejecutando simulaciones físicas. El problema es que consistentemente, en la 51.ª simulación, java arrojará un error generalmente debido a que hay un montón de memoria (mi programa finalmente ejecuta miles de simulaciones).
¿Hay alguna forma de que no pueda simplemente aumentar el espacio de montón pero modifique mi programa para que el espacio del montón se borre después de cada ejecución para que pueda ejecutar un número arbitrario de simulaciones?
Gracias
-editar-
Gracias chicos. Resulta que el software del simulador no borraba la información después de cada ejecución y todas esas ejecuciones se almacenaron en una lista de arrays.
Hay una variedad de herramientas que puede usar para ayudar a diagnosticar este problema. El JDK incluye JVisualVM que le permitirá conectarse a su proceso en ejecución y mostrar qué objetos podrían estar fuera de control. Netbeans tiene un envoltorio que funciona bastante bien. Eclipse tiene el analizador de memoria Eclipse que es el que uso más a menudo, simplemente parece manejar archivos de volcado grandes un poco mejor. También hay una opción de línea de comando, -XX:+HeapDumpOnOutOfMemoryError que le proporcionará un archivo que básicamente es una instantánea de la memoria de proceso cuando el programa se bloqueó. Puede usar cualquiera de las herramientas mencionadas anteriormente para verlo, realmente puede ayudar mucho al diagnosticar este tipo de problemas.
Dependiendo de qué tan duro esté funcionando el programa, puede ser un caso simple en el que la JVM no sabe cuándo puede ser un buen momento para recolectar basura, también puede buscar en las opciones de recolección de basura paralelas.
Intente agregar -Xmx para obtener más memoria ( java -Xmx1024M YourClass
) y no olvide dejar de hacer referencia a las variables que ya no necesita (pérdidas de memoria).
Me gustaría agregar que este problema es similar a las fugas de memoria Java comunes.
Cuando el recolector de elementos no utilizados de JVM no puede borrar la memoria "residual" de su aplicación Java / Java EE a lo largo del tiempo, OutOfMemoryError: el espacio de montón de Java será el resultado.
Es importante realizar primero un diagnóstico adecuado:
- Habilitar verbose:gc . Esto le permitirá comprender el patrón de crecimiento de memoria con el tiempo.
- Genere y analice un Volcado de montón JVM . Esto le permitirá comprender la huella de la memoria de su aplicación e identificar el origen de la (s) fuga (s) de memoria.
- También puede utilizar los perfiles de Java y el analizador de fugas de memoria de tiempo de ejecución, como Plumbr , para ayudarlo con esta tarea.
No hay forma de aumentar dinámicamente el montón de forma programática ya que el montón se asigna cuando se inicia la Máquina virtual de Java.
Sin embargo, puedes usar este comando
java -Xmx1024M YourClass
para configurar la memoria en 1024
o, puedes establecer un minimo
java -Xms256m -Xmx1024m YourClassNameHere
No. El recolector de basura limpia el montón siempre que lo desee. Puede solicitar que se ejecute (con System.gc()
) pero no se garantiza su ejecución.
Primero intente aumentar la memoria configurando -Xmx256m
Se supone que Java borrará el espacio de montón para usted cuando ya no se haga referencia a todos los objetos. En general, no lo liberará al sistema operativo, sino que mantendrá esa memoria para su propia reutilización interna. Tal vez compruebe si tiene algunas matrices que no se borran o algo así.
Si está utilizando mucha memoria y tiene fugas de memoria, le recomendamos comprobar si está utilizando una gran cantidad de ArrayList
o HashMap
con muchos elementos cada uno.
Un ArrayList
se implementa como una matriz dinámica . El código fuente de Sun / Oracle muestra que cuando se inserta un nuevo elemento en una ArrayList
completa, se crea una nueva matriz de 1,5 veces el tamaño de la matriz original y se copian los elementos. Lo que esto significa es que podría estar desperdiciando hasta el 50% del espacio en cada ArrayList
que use, a menos que llame a su método trimToSize
. O mejor aún, si conoce la cantidad de elementos que va a insertar de antemano, llame al constructor con la capacidad inicial como argumento.
No examiné el código fuente de HashMap
mucho cuidado, pero a primera vista parece que la longitud de la matriz en cada HashMap
debe ser una potencia de dos, lo que la convierte en otra implementación de una matriz dinámica. Tenga en cuenta que HashSet
es esencialmente un envoltorio alrededor de HashMap
.
También enfrenté el mismo problema. Resolví haciendo la compilación siguiendo los pasos a continuación.
-> Haga clic derecho en el proyecto seleccione RunAs -> Ejecutar configuraciones
Seleccione su proyecto como BaseDirectory. En lugar de objetivos, da eclipse: eclipse install
-> En la segunda pestaña, da -Xmx1024m como argumentos VM.