2011-10-04 22 views
6

Tengo que asumir que el siguiente método no tiene fugas de memoria:Java Memoria Asignación Fugas

public final void setData(final Integer p_iData) 
{ 
    data = p_iData; 
} 

Dónde data es una propiedad de alguna clase.

Cada vez que se llama al método, un new Integer reemplaza la referencia data actualmente existente. Entonces, ¿qué está pasando con los datos actuales/antiguos?

Java tiene que estar haciendo algo bajo el capó; de lo contrario, tendríamos que anular cualquier objeto cada vez que se asigna un objeto.

+0

Sí, se llama [BigBadGarbageCollector] (http://en.wikipedia.org/wiki/Garbage_collection_ (computer_science)). –

+0

Java es compatible con GC automático. Busque aquí un ejemplo de código de demostración: http://www.herongyang.com/Computer-History/Java-Support-Automatic-Garbage-Collection.html –

Respuesta

7

explicación simplista:

periódicamente el recolector de basura se ve en todos los objetos en el sistema, y ​​ve que no son accesibles más de las referencias en vivo. Libera cualquier objeto que ya no sea alcanzable.

Tenga en cuenta que su método no no crear un nuevo objeto Integer en absoluto. Una referencia al mismo objeto Integer podría pasarse una y otra vez, por ejemplo.

La realidad de la recolección de basura es mucho más complicado que esto: GC

  • modernos tienden a ser generacional, en el supuesto de que la mayoría de los objetos son de corta duración, por lo que no tiene que comprobar el montón completo (posiblemente grande) como a menudo; simplemente puede verificar con frecuencia objetos "recientes" para estar vivo
  • Los objetos pueden tener finalizadores: el código se ejecutará antes de que sean recolectados. Esto retrasa la recolección de basura de tales objetos por un ciclo, y el objeto podría incluso "resucitar" en sí mismo haciéndose accesible
  • GC modernos pueden recoger en paralelo, y tienen numerosas opciones de ajuste
0

Al final se obtiene la basura recolectada.

3

Java es un lenguaje recogido de basura.

Una vez que ya no hay más referencias en vivo a un objeto, se vuelve elegible para la recolección de basura. El recopilador se ejecuta de vez en cuando y reclamará la memoria del objeto.

En pocas palabras, su código es 100% correcto y no tiene fugas de memoria.

+1

+1 - Respuesta simple y suficiente. –

0

si no hay allí referencia a data, el recolector de basura de java va a limpiar los datos antiguos y libera la memoria

0

en realidad, puesto entero es un objeto no es un tipo primitivo, la línea:

data = p_iData; 

está actualizando una referencia.

Ahora, el antiguo objeto que this.data solía señalar será examinado por el GC para determinar si no hay más referencias a ese objeto.Si no, ese objeto se destruye y la memoria se libera (en algún momento posterior)

0

Si el objeto referenciado anteriormente por los datos ya no está referenciado por ninguna estructura de objetos a la que se hace referencia desde cualquier hilo en ejecución, es elegible para recolección de basura . GC es realizado por Java en segundo plano para liberar la memoria de objetos no utilizados.

0

Quiero mostrar un ejemplo de que en algún código:

int x; 
x=10; 
x=20; 

inicialmente asignados i x 10 x de nuevo a 20 primera memoria de referencia estará a cargo de Java GC. Java GC es un hilo que se ejecuta de forma continua y verifica la memoria sin referencia y la limpia.

+1

No del todo porque 'int' es un tipo primitivo e incluso si toma' Integer x; 'en su lugar y deja las siguientes líneas para usar el autoboxing en Integer, nada se limpiaría porque' Integer.valueOf (int i) 'utiliza el' enter 'instancias para todos los valores entre -128 y 127 que nunca son GCed. Al menos en la implementación estándar de Java. – Gandalf