2012-06-21 28 views
6

Me estoy ejecutando de vez en cuando en tareas de eclipse que requieren una gran cantidad de memoria. Entonces, jvm mientras la tarea se está ejecutando se traga unos 2-3 gb de RAM, eso está bien. Pero una vez que jvm tomó esa memoria, no la libera y tengo una situación en la que la memoria utilizada en el montón es de aproximadamente 200 MB con un tamaño de almacenamiento total de aproximadamente 3 gb y eso es realmente no deseado ya que otros programas están muriendo de hambre.force jvm para devolver la memoria nativa

Probé los parámetros Max/MinHeapFreeRatio para forzar a jvm a reducir el consumo de una memoria no utilizada. Esa es mi Eclipse config.ini archivo:

-startup 
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar 
--launcher.library 
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502 
-vm 
c:/Program Files/Java/jdk1.6.0_26/bin/javaw.exe 
-showlocation 
-product 
org.eclipse.epp.package.jee.product 
--launcher.defaultAction 
openFile 
--launcher.XXMaxPermSize 
256M 
-showsplash 
org.eclipse.platform 
--launcher.XXMaxPermSize 
256m 
--launcher.defaultAction 
openFile 
-vmargs 
-Duser.name=Michael Nesterenko 
-Dosgi.requiredJavaVersion=1.5 
-Xms512m 
-Xmx4096m 
-XX:MinHeapFreeRatio=10 
-XX:MaxHeapFreeRatio=30 

Pero eso no ayuda, todavía tengo situaciones en las que hay un montón de memoria no utilizada.

+0

¿Es práctico tener dos atajos/shell-scripts diferentes para iniciar Eclipse, con diferentes conjuntos de parámetros para cuando tiene que hacer tareas que requieren mucha memoria? –

Respuesta

4

Java asigna el tamaño máximo de almacenamiento dinámico cuando se inicia como memoria virtual. A medida que utiliza la memoria, se asigna como memoria principal real. Nunca encoge este tamaño. La única forma de liberar esta memoria es que el programa salga.

Java compactará el uso de memoria de modo que muchas de las páginas que ha utilizado anteriormente se puedan intercambiar en el disco, sin embargo, esto puede tener un impacto de rendimiento significativo si las necesita de nuevo.

+5

No estoy de acuerdo. La memoria puede encogerse. De este documento (http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html): '-XX: MaxHeapFreeRatio = 70 \t Porcentaje máximo de pila libre después de GC para evitar el encogimiento. 'Eso significa que si más del 70% del montón es libre, el montón se reducirá. También según este informe de errores (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735): 'La JVM de HotSpot ya liberará la memoria al sistema operativo si no es necesaria para objetos Java activos .'' –

+0

El montón usado se reducirá, sin embargo, el tamaño residente de la aplicación no se reduce. 'No sé de qué habla el crítico de errores tampoco. NUNCA he visto reducir la huella de la memoria virtual. ' –

+0

En realidad, la memoria virtual no es un problema, puede ser de cualquier tamaño, ya que es un proceso privado. Necesito reducir el conjunto de trabajo de proceso, es decir, el uso de RAM física. –

0

recomiendo que lea la segunda de "stolsvik" 's comentarios sobre este Java bug/RFE - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6498735 En él se explica con cierto detalle cómo funcionan los -XX:MinHeapFreeRatio y -XX:MaxHeapFreeRatio opciones.

Si eso no ayuda, podría intentar forzar un GC un par de veces para ver si eso activa la memoria. Y active el registro de GC para ver si eso revela algo.


Un posible problema que podría impedir la liberación de memoria es la asignación de memoria que no es de montón por JVM; p.ej. para pilas de subprocesos, montón de código nativo o búferes directos asignados.

Cuestiones relacionadas