2012-06-27 14 views
5

Duplicar posible:
method finalize and exceptionsExcepción en el método finalize

El recolector de basura invoca finalize() método cuando un objeto está a punto de liberado de memoria. ¿Qué ocurre cuando se produce una excepción en el método finalize()?

¿Continuará GC y liberará la memoria, o GC detendrá el proceso para ese objeto?

+6

¿Por qué está escribiendo los métodos 'finalize()' en su código Java? Es una mala práctica en la mayoría de los casos. –

+2

No, no he escrito dicho método, solo para mi conocimiento – Kumar

Respuesta

8

Si la excepción se plantea en una declaración try-catch y está correctamente capturada, entonces sí, "el GC procederá más adelante", como lo hace en los programas normales.

Pero si la excepción lanzada no se maneja entonces, de acuerdo con el JSL,

Si una excepción no capturada se lanza durante la finalización, la excepción es ignorado y la finalización de ese objeto termina.

Por lo tanto, en este caso el "GC detendrá el proceso para ese objeto" y en cuyo caso puede ser que algunos de sus recursos no se hayan liberado correctamente.

Por cierto, el finalizador tiene 2 inconvenientes:

  • No se puede estar seguro de que el método de finalización será nunca ser ejecutado (de this blog)

    Por qué hacer lo anterior, si el el recolector de basura siempre llamará a finalizar antes de liberar la memoria asociada con un objeto? La razón es porque el recolector de basura no siempre tiene la oportunidad de limpiar los objetos antes de que termine la JVM.

    objetos de fuerza
  • finalizadores para ser promovidos al espacio de edad (que lleva más tiempo en cobrar), y posponer la GC hasta que se ejecute el finalizador, añadiendo más sobrecarga a la algotithm GC. (cf Java performance Tuning 2nd, Edition, de Jack Shirazi).

+0

Sí, siento que tienes razón. ¿No es eso hacer trampa en el GC? Lo que quiero decir es que GC está en proceso significa que la memoria y solo la tiene sin más referencia. Si la memoria del objeto contiene la referencia de otro objeto es elegible para GC.Si no, ¿cuál es el propósito exacto del método de finalización? – Kumar

+1

El método @Kumar Finalize no se usa para "forzar" la recopilación de un objeto, sino que se usa para liberar recursos que un administrador de almacenamiento automático no puede liberar automáticamente. Nunca uso esto Supongo que es útil en algún caso raro. Como puede ver en el enlace del blog, a menudo solo puede usar una declaración finally y un recurso de liberación aquí (por ejemplo, cerrar InputStream, Reader, etc ...). –

+0

Creo que tendré que volver a enmarcar mi comentario, es así, GC está en proceso y se está recuperando una memoria de objeto. Tiene el método finilaze. Si arroja una excepción, GC no borraría la memoria, ¿no es esta laguna en java? Y la siguiente pregunta es, generalmente, las personas escriben que el método de "finalización" se usa para limpiar el recurso, entonces mi pregunta es si un objeto es elegible para GC tendrá una referencia a algún recurso, de ser así, ¿cómo será tratado como no? referencia por GC. – Kumar

0

"Cualquier excepción lanzada por el método de finalización hace que la finalización de este objeto se detenga, pero de lo contrario se ignora." http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#finalize()

+0

el * Para ser claro * el resumen es muy incompleto, inexacto y tergiversa lo que realmente sucede. –

+0

Únase a la discusión a continuación para explorar más – Kumar

+0

@Jarrod: tiene razón, lo siento, mi respuesta fue apresurada. Estaba tratando de entender que el objeto se seguirá recolectando si se lanza una excepción. He eliminado el resumen inútil. –

Cuestiones relacionadas