jdk - java runtime environment
Libere la memoria de java para el sistema operativo en tiempo de ejecución. (5)
Puede deshacerse de los objetos y sugerir que el recolector de basura haga su trabajo, pero si el GC no lo considera necesario, se ignorará la solicitud. Entonces, en resumen, ''no''.
Tenga en cuenta que la memoria asignada a las aplicaciones Java. se establece antes de la aplicación. comienza y no es ajustable.
Supongamos que tengo una aplicación Java Swings, configuro el mínimo Heap es de 64 MB y Max Heap de 2 GB, cuando el usuario inicia la aplicación, se mostrará la pantalla de inicio de sesión, en este momento la aplicación usa 64 MB de derechos. Desde mi Windows 7, puedo ver que a la aplicación java se le asignan 64 MB del Monitor de recursos de memoria del sistema operativo (en realidad, es más de 64 MB porque JVM necesita memoria para su tarea).
Después de eso, el usuario hace un trabajo muy pesado, entonces la aplicación usa 2G. Luego, el usuario cerrar la sesión de la aplicación, la pantalla de inicio de sesión se muestra de nuevo (la aplicación aún no está cerrada). En este momento la memoria real de que la aplicación está utilizando 64MB (supongamos que esta es la aplicación de administración de memoria perfecta), pero con el sistema operativo esta aplicación todavía está utilizando 2G de RAM, puedo verlo en el monitor de recursos del sistema operativo.
Quiero que mi aplicación libere la memoria en el sistema operativo cuando no necesita usar una gran memoria. ¿Puedo hacerlo en tiempo de ejecución con la aplicación Java?
Me refiero a cuando mi aplicación necesita usar 64MB de RAM, entonces el SO le da 64MB solamente, cuando necesita 2GB de ram entonces el OS le da 2GB, después de eso necesita 64MB de RAM, entonces el OS le da 64MB solo de nuevo, yo no quiero que desperdicie 2000MB - 64MB = 1936MB.
¿Puedo hacer eso?
Gracias,
He publicado los resultados de mi prueba allí . Básicamente, MaxHeapFreeRatio no es respetado por cada implementación de GC, y, para empeorar las cosas, parece ser necesario que haya suficiente actividad de almacenamiento dinámico para activarlo de manera oportuna, es decir. podría ser que requiera 2 carreras completas de GC para liberar realmente la memoria al sistema operativo. Y si tiene una huella de memoria de ráfaga de X GB, entonces probablemente tenga que asignar 1 o 2 veces esa cantidad para disparar el tamaño del montón. O llama a System.gc () manualmente.
Si el rendimiento no es un problema, y la huella de memoria es lo único que cuenta, intente:
-XX:UseSerialGC -Xms16M -Xminf=5 -Xmaxf=10
Intente dividir partes de su código en una secuencia separada y deséchelo cuando ya no lo necesite.
El serialgc en hotspot devolverá la memoria ... al menos solía hacerlo. Tu rendimiento se hundirá.
Todos los recolectores de basura en IBM J9 jvm liberarán memoria. No estoy seguro de que esta jvm sea una descarga gratuita ...
La mejor respuesta es, ¿por qué estás preocupado? La memoria es muy barata en estos días y la memoria gratuita es una pérdida de memoria. ¿Es esto realmente un problema? El sistema operativo colocará la memoria adicional no utilizada en el disco de todos modos. La mejor respuesta es ignorarlo. :)
También podría considerar el uso de Google en el almacenamiento fuera de almacenamiento, quizás en la memoria caché Teracotta / eh.
EDITAR:
Me acabo de dar cuenta en JDK1.7u6, que al usar G1GC con un Xms pequeño y un Xmx grande, el recolector de basura reducirá el tamaño del montón después de algunas colecciones de basura donde se han liberado objetos en exceso.
Quiero que mi aplicación libere la memoria en el sistema operativo cuando no necesita usar una gran memoria. ¿Puedo hacerlo en tiempo de ejecución con la aplicación Java?
No, no puedes.
En algunas circunstancias, el GC liberará la memoria al sistema operativo por sí mismo, pero no conozco ninguna JVM que permita que una aplicación le indique al GC que haga esto. Y además de eso, el GC es bastante conservador al hacer esto porque ... como regla general ... la JVM funcionará de manera más eficiente con más memoria, y continuamente solicitar / devolver memoria al SO es ineficiente.
Tenga en cuenta que la opción de ajuste de GC -XX:MaxHeapFreeRatio
se puede utilizar para especificar la relación máxima de montón libre a usado antes de que el GC devuelva la memoria. Sin embargo, hay complicaciones. Por ejemplo, no todos los GC disponibles respetan esta opción. Si vas a probar este enfoque, te sugiero que hagas una investigación ... y no esperes milagros.