2012-05-10 20 views
8

Hola considero que tengo tres variables de matriz de a[dynamic], b[dynamic], c[dynamic]. Pueden ser de cualquier tamaño ahora quiero destruir la variable decir a. Estoy seguro de que no usaré la variable por más tiempo. cualquier idea y sugerencia son bienvenidasEliminar una memoria variable

+3

Heard del recolector de basura? – adarshr

+1

¿Por qué quieres hacer esto? ¿Entiendes lo que hace el recolector de basura? –

+0

¡Supongo que te estás moviendo de C a Java! –

Respuesta

16

Puede indicar al recolector de basura que una matriz puede ser liberado mediante la asignación de null a ella:

int[] a = new int[someSize]; 
    int[] b = new int[someSize]; 
    .... 
    // I no longer need 'a' 
    a = null; 
    // ... but I can still use 'b' 

Sin embargo, hay una serie de cosas para tomar nota:

  • Esto no lo hace libera el espacio. Más bien, está haciendo que la matriz elegible sea liberada por el recolector de basura. Es posible que el GC no logre liberarse durante mucho tiempo.

  • De hecho, la matriz solo es elegible para la recolección de basura si es no alcanzable. Si ha asignado una referencia a la matriz a otra variable (aún en vivo) u objeto alcanzable, el GC no la reclamará.

  • Rara vez tiene sentido hacerlo en aplicaciones de Java reales. Es una práctica normal simplemente permitir que las variables salgan del alcance en el curso normal del cómputo . Solo explícitamente null una variable (o campo de objeto o elemento de matriz) como esa si la variable no va a quedar fuera del alcance durante mucho tiempo Y se refiere a una gran matriz/objeto o red.


1 - Cualquier aplicación JVM razonable sabrá que las variables locales salen de alcance cuando un método salidas. Si la JVM rastrea los ámbitos en una granularidad más fina es específica de la implementación, y (para ser honesto) I no sé cómo las JVM manejan esto en la práctica.

Tenga en cuenta que casi cualquier cosa es técnicamente conformes a los requisitos JLS .... siempre que el GC no elimina accesible (es decir, no basura) Los objetos que incluye una JVM hipotética que no hace la recolección de basura en absoluto !

+0

ya yo también tuve ese pensamiento. ¿Eliminará la memoria? ¿Quiero llamar al gc después de asignar null? – special

+0

solo puede solicitar que gc reciba una llamada, pero no puede garantizar que – mprabhat

+0

1) El GC liberará la matriz y recuperará el espacio ... eventualmente. 2) NO debe llamar al GC explícitamente para acelerar el proceso. Deje que el GC funcione cuando lo necesite y no interfiera. (Si llama a 'System.gc()' usted mismo, puede no tener ningún efecto. Y si hace que el GC se ejecute, es probable que este no sea el momento correcto ... desde el punto de vista de la eficiencia del GC .) –

2

Stephen C ha respondido a su pregunta, aunque para el tipo no primitivo, también quisiera asegurarse de que todos los objetos dentro de su matriz estén marcados como nulos si no los necesita, esto asegurará que no tenga pérdida de memoria.

Algo así como:

for(Object obj : myObjectArray){ 
    obj = null; 
} 

luego hacer su matriz nula referencia

myObjectArray = null; 
+1

Después de que la referencia a la matriz es nula, todos los índices de la matriz se vuelven inalcanzables. Hacerlos nulos primero no tiene impacto. Ahora, * puede * haber otras referencias a la matriz o a sus índices, pero ese es un problema aparte sin relación con esto. – entonio

+0

@entonio - De acuerdo. En la mayoría de las situaciones, anular es innecesario, y si no es necesario, es un desperdicio de ciclos de CPU. Y además, siempre existe la posibilidad de que erróneamente 'null 'cosas demasiado temprano o demasiado agresivo. IMO, es mejor que NO lo hagamos ... a menos que tenga una buena razón para creer que no anular * causará * una pérdida significativa de memoria. –

0

Para eliminar todo elemento de arrayList

arrayList.removeAll(arrayList);

Cuestiones relacionadas