2010-09-27 16 views

Respuesta

9

El objeto no se recogerá hasta que se pone de nuevo inalcanzable.

De acuerdo con JavaDoc, no se volverá a llamar a finalize().

3

Sí, esta es la razón por la que no usa finalizadores (bueno, una de las muchas razones).

No es una colección de referencia que se hace para hacer estas cosas. Lo buscaré y lo publicaré aquí en un segundo, pero creo que es PhantomReference.

Sí, PhantomReference:

objetos de referencia Phantom, que están en cola después de que el colector determina que sus referentes de lo contrario se pueden reutilizar. Las referencias ficticias se utilizan con mayor frecuencia para programar acciones de limpieza premortem de una manera más flexible que la que es posible con el mecanismo de finalización de Java.

+0

No, es un motivo por el que no se escribe un finalizador muy incompleto (si no hubiera otros motivos suficientes). –

7

Si lee cuidadosamente la descripción de la API, verá que el finalizador puede hacer que el objeto vuelva a estar accesible. El objeto no se descartará hasta que sea inalcanzable (nuevamente), pero finalize() no se invocará más de una vez.

+0

En realidad, el finalizador * does * hace que el objeto sea muy accesible a través de la referencia rooteada entre el momento en que se encuentra que el objeto es inalcanzable y la hora en que se ejecuta el finalizador. Si durante ese tiempo el objeto que resultó ser inalcanzable se convierte en la única referencia que sobrevive a algún otro objeto, ese otro objeto no será coleccionable hasta que se ejecute el finalizador o esa referencia se invalide por algún otro medio. – supercat

10

A continuación, el objeto no recibe basura recogida, básicamente. Esto se llama objeto resurrección. Realiza una búsqueda de ese término, y deberías obtener un montón de artículos interesantes. Como mencionó Jim, un punto importante es que el finalizador solo se ejecutará una vez.

3

lo que realmente hace otra pasada para comprobar y asegurarse de que no hay más referencias al objeto. Como fallará esa prueba en su segunda pasada, no liberará la memoria del objeto.

Dado que finalizar solo se llama una sola vez para un objeto dado, la próxima vez cuando no tenga referencias, simplemente liberará la memoria sin llamar a finalizar. Alguna buena información here en la finalización.

Cuestiones relacionadas