2012-07-04 25 views
28

Sé que Java tiene su propia colección de elementos no utilizados, pero a veces quiero eliminar la basura manualmente. ¿Hay alguna manera de hacer el trabajo así? Y teniendo en cuenta que tengo un largo o muy largo function que declara muchas variables, ¿es una buena idea eliminar la memoria no utilizada inmediatamente después de usarla en lugar de la recolección automática al final de la función? Si elimino basura de forma manual, ¿afecta la velocidad de mi aplicación? ¡Gracias por ayudar!Eliminar la memoria de la variable no utilizada en java

+1

Es una buena idea configurar sus variables a 'null' después de su uso. HotSpot lo hará por usted también, pero no con una garantía del 100%. –

Respuesta

28

No hay forma directa e inmediata de liberar memoria en java. Puede que intenta convencer a el recolector de basura para quitar un objeto utilizando la bien conocida:

Object obj = new Object(); 
// use obj 
obj = null; 
System.gc(); 

pero no hay ninguna garantía de que esta memoria se encuentran libres de inmediato.

Si bien esto se aplica a la memoria de pila, los elementos asignados de pila solo pueden liberarse cuando la función retorna.

+2

** Hay ** una garantía de que GC hará todo lo posible para hacer algo de inmediato. Javadoc: "** Cuando el control vuelve de la llamada al método **, la Máquina Virtual Java ha hecho un gran esfuerzo para recuperar espacio de todos los objetos descartados". Simplemente no hay garantía de lo que se limpiará. –

4

Puede llamar al System.gc(); que podría llevar al recolector de basura a la limpieza. Pero seguro que esto afectará el rendimiento de su aplicación. En general, no tiene sentido tratar de "optimizar" nada aquí.

3

Puede asignar null a las variables, verificar que no haya referencias a estos objetos y llamar a System.gc(), pero es solo una sugerencia para que JVM llame a un GC, pero no hay garantía. La recopilación de basura cal ralentiza la aplicación hasta que se congela (GC del stop-the-world).

4

No vale la pena hacerlo manualmente, ya que el recolector de basura por lo general hará un mejor trabajo, y hacerlo por sí mismo probablemente no hará una diferencia notable en su aplicación.

Si debe, puede establecer las referencias a null y llamar al System.gc(), y esto invocará el recolector de basura manualmente.

12

¿Por qué quiere eliminar la basura "manualmente"? Si es porque no tienes memoria, recuerda que Java va a ejecutar la recolección de basura antes de lanzar OutOfMemoryError. Y si realmente no tienes memoria, entonces no hay basura que incluso tú puedas eliminar manualmente.

Declarar una variable no asigna memoria en el montón. Hacer un objeto con new hace. Las JVM pueden hacer análisis de escape incluso para las referencias de objeto GC que no han salido del alcance pero que ya no se usan antes del final del método.

Si desea proactivamente desea liberar memoria en un punto determinado donde los recursos del sistema no son críticos, utilice una mejor sintonización JVM como el uso de los algoritmos paralelos de GC.

"Manualmente" la recolección de basura estableciendo las cosas en null probablemente ralentiza las cosas si solo porque paga el costo de anular referencias sin sentido, o, invocando GC más veces de las necesarias.

2

Una sugerencia muy común es usar System.gc()Cuál la JVM puede optar por ignorar. También puede usar el alcance, por ejemplo:

import java.io.*; 
public class AutoVariableTest 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String fileName = "test.txt"; 
     {// This is local block just to keep auto variable in check 
      File file = new File(fileName); // file is not visible outside the scope and is available for garbage collection 
      BufferedReader br = null; 

      try{ 
       br = new BufferedReader(new FileReader(file)); 
       // ... 
      }finally{ 
       if(br != null) 
        br.close(); 
      } 
     }// local block end 
    } 
} 
1

¡Java no es adecuado si está intentando administrar la memoria!O bien, escriba su propio mecanismo de recolección de basura en JVM si tiene mucho tiempo

1

Si tiene la intención de reducir la cantidad de memoria utilizada después de cierto punto, puede ser mejor que use matrices para sus variables para que pueda establecer una matriz para anular una vez que ya no es necesario. De esta forma, le toma mucho menos tiempo al recolector de basura limpiar todos sus datos.

Cuestiones relacionadas