Saltar al contenido

¿Cómo liberar memoria en Java?

Después de mirar en diversos repositorios y páginas webs de internet al final hallamos la respuesta que te mostramos aquí.

Solución:

Java usa memoria administrada, por lo que la única forma en que puede asignar memoria es usando el new operador, y la única forma en que puede desasignar memoria es confiando en el recolector de basura.

Este documento técnico de administración de memoria (PDF) puede ayudar a explicar lo que está sucediendo.

También puedes llamar System.gc() para sugerir que el recolector de basura se ejecute inmediatamente. Sin embargo, Java Runtime toma la decisión final, no su código.

Según la documentación de Java,

Llamar al método gc sugiere que la máquina virtual de Java se esfuerce en reciclar objetos no utilizados para que la memoria que ocupan actualmente esté disponible para su reutilización rápida. Cuando el control regresa de la llamada al método, la máquina virtual de Java ha hecho un gran esfuerzo para recuperar espacio de todos los objetos descartados.

Nadie parece haber mencionado explícitamente establecer referencias de objetos a nullque es una técnica legítima para “liberar” la memoria que tal vez desee considerar.

Por ejemplo, supongamos que ha declarado un List al comienzo de un método que creció en tamaño hasta ser muy grande, pero solo se requirió hasta la mitad del método. En este punto, podría establecer la referencia de la lista en null para permitir que el recolector de basura reclame potencialmente este objeto antes de que se complete el método (y la referencia queda fuera del alcance de todos modos).

Tenga en cuenta que rara vez uso esta técnica en realidad, pero vale la pena considerarla cuando se trata de estructuras de datos muy grandes.

System.gc(); 

Ejecuta el recolector de basura.

Llamar al método gc sugiere que la máquina virtual de Java se esfuerce en reciclar objetos no utilizados para que la memoria que ocupan actualmente esté disponible para su reutilización rápida. Cuando el control regresa de la llamada al método, la máquina virtual de Java ha hecho un gran esfuerzo para recuperar espacio de todos los objetos descartados.

No recomendado.

Editar: Escribí la respuesta original en 2009. Ahora es 2015.

Los recolectores de basura han mejorado constantemente en los ~ 20 años que Java existe. En este punto, si está llamando manualmente al recolector de elementos no utilizados, es posible que desee considerar otros enfoques:

  • Si está forzando GC en una cantidad limitada de máquinas, puede valer la pena tener un punto de equilibrio de carga fuera desde la máquina actual, esperando que termine de servir a los clientes conectados, el tiempo de espera después de un período para colgar las conexiones, y luego simplemente reinicie la JVM. Esta es una solución terrible, pero si está mirando System.gc(), los reinicios forzados pueden ser una posible solución provisional.
  • Considere usar un recolector de basura diferente. Por ejemplo, el colector G1 (nuevo en los últimos seis años) es un modelo de baja pausa; usa más CPU en general, pero es mejor no forzar nunca una parada brusca en la ejecución. Dado que las CPU del servidor ahora casi todas tienen múltiples núcleos, esta es una compensación realmente buena para tener disponible.
  • Mire el uso de memoria de sintonización de sus banderas. Especialmente en las versiones más nuevas de Java, si no tiene tantos objetos en ejecución a largo plazo, considere aumentar el tamaño de newgen en el montón. newgen (joven) es donde se asignan nuevos objetos. Para un servidor web, todo lo creado para una solicitud se coloca aquí, y si este espacio es demasiado pequeño, Java dedicará más tiempo a actualizar los objetos a una memoria de mayor duración, donde es más costoso eliminarlos. (Si newgen es un poco demasiado pequeño, lo pagará). Por ejemplo, en G1:
    • XX:G1NewSizePercent (el valor predeterminado es 5; probablemente no importe).
    • XX:G1MaxNewSizePercent (predeterminado en 60; probablemente aumente esto).
  • Considere decirle al recolector de basura que no está de acuerdo con una pausa más larga. Esto provocará ejecuciones de GC más frecuentes, para permitir que el sistema mantenga el resto de sus restricciones. En G1:
    • XX:MaxGCPauseMillis (predeterminado en 200).

Si para ti ha sido útil nuestro artículo, nos gustaría que lo compartas con otros entusiastas de la programación de esta manera contrubuyes a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *