2010-06-04 24 views

Respuesta

46

Deje de hacer referencia a él.

+6

Me trajo una sonrisa :) – BalusC

+24

objeto Java == crisis existencial "Si nadie me está haciendo referencia, ¿sigo existiendo?" –

+0

Deje todos los pedazos pobres de la memoria solamente. Deja de hacer referencia a ellos. Ahora :) – schnaader

6

Eliminando toda la referencia a esa matriz de bytes. El recolector de basura se encargará del resto.

13

Al crear un nuevo byte [] en Java, haces algo como

byte[] myArray = new byte[54]; 

para liberarlo, que debe hacer

myArray = null; 

Si algo hace referencia a su matriz de bytes, como

yourArray = myArray; 

necesita establecer también las otras referencias a nulo, como

yourArray = null; 

En Java, la recolección de basura es automática. Si la JVM puede detectar que un pedazo de memoria ya no es alcanzable por todo el programa, entonces la JVM liberará la memoria por usted.

+2

La JVM liberará la memoria cuando lo desee. Como una aproximación de primer orden para casi todos los programas de Java, no se preocupe por la memoria, sea feliz, la JVM le ha dado la espalda. –

+4

Generalmente, no debería necesitar establecer una referencia a nulo para permitir que se recopile el objeto. Si necesita hacer esto, es muy probable que haya un problema serio con su implementación en mi humilde opinión. –

+3

@Peter: Depende. Si sabe que la variable va a vivir bastante más tiempo que la matriz a la que se refería, entonces establecerla tiene sentido explícitamente. Eso es bastante raro sin embargo. –

1

Establecer todas las referencias a null lo convertirá en candidato para la recolección de basura automática de Java. Sin embargo, no puedes estar seguro de cuánto tardará esto en suceder. Si realmente necesita reclamar explícitamente la memoria inmediatamente, puede hacer una llamada al System.gc();

También para borrarlo puede que no necesite establecer las referencias a nulo explícitamente. Si las referencias quedan fuera del alcance, se anulan automáticamente, p. una referencia de variable local se anulará una vez que el método en el que se declara termina de ejecutarse. Por lo tanto, las variables locales generalmente se lanzan implícitamente todo el tiempo durante el tiempo de ejecución de una aplicación.

+3

System.gc() no reclama memoria inmediatamente. Simplemente le dices a la JVM: "Por favor, si quieres, tal vez puedas limpiar todo". Es solo una sugerencia. –

+3

System.gc() no forzará un GC. Es solo una sugerencia. Es como la diferencia entre tu compañero de habitación que dice "amigo, este lugar es un desastre, ¿qué pasa con eso?" y tu madre diciendo "¡LIMPIE ESTE INSTANTE!" En la mayoría de las implementaciones, System.gc() es simplemente tu compañero de cuarto. –

+0

@Jonathon @Jim No estaba al tanto de eso. Los javadocs dicen "Ejecuta el recolector de basura. Llamar al método gc sugiere que la Máquina Virtual Java gasta esfuerzos para reciclar objetos no utilizados con el fin de hacer que la memoria que ocupan actualmente esté disponible para su reutilización rápida. Cuando el control vuelve de la llamada al método, Java Virtual Machine ha hecho un gran esfuerzo para recuperar espacio de todos los objetos descartados ". y en mi experiencia de llamarlo parece que se ejecutó de inmediato, pero tal vez estoy equivocado – Alb

Cuestiones relacionadas