예외

2012-06-27 4 views
5

가능한 중복은 : 객체가 메모리에서 해제하려고 할 때
method finalize and exceptions예외

가비지 컬렉터 finalize() 메소드를 호출한다. finalize() 메소드에서 예외가 발생하면 어떻게됩니까?

GC가 더 진행되어 메모리를 해제합니까, 그렇지 않으면 GC가 해당 개체의 프로세스를 중단할까요?

+6

Java 코드에'finalize()'메소드를 쓰는 이유는 무엇입니까? 대부분의 경우 모두 나쁜 습관입니다. –

+2

아니요. 내 지식을 위해서 그런 방법을 쓰지 않았습니다. – Kumar

답변

8

try-catch 문에서 예외가 발생하고 올바르게 catch 된 경우 예, 일반 프로그램에서와 마찬가지로 "GC가 더 진행됩니다". 캐치되지 않는 예외가 마무리 중에 발생되는 경우 JSL에 따라

그러나 발생한 예외는 다음 처리되지 않는 경우

,

는, 예외는 무시되어 오브젝트의 파이 나라 이즈는 종료합니다.

따라서이 경우 "GC가 해당 개체의 프로세스를 중단합니다."경우 일부 리소스가 올바르게 릴리스되지 않았을 수 있습니다. 그런데

는 파이널 2 단점이 있습니다 :

  • 경우 생성 위를 할 이유는 finalize 메소드 이제까지

    (this blog에서) 실행됩니다 당신은 확신 할 수 없다 가비지 컬렉터는 객체와 관련된 메모리를 확보하기 전에 항상 finalize를 호출합니다. 그 이유는 가비지 수집기가 JVM이 종료되기 전에 항상 객체를 정리할 기회를 얻지 못하기 때문입니다.

  • 종료 자 힘 객체 (즉 수집하는 데 시간이 더 소요) 오래된 공간으로 승격하고, 파이널 라이저가 실행될 때까지 GC의 algotithm에 더 많은 오버 헤드를 추가하여 GC를 연기한다. (Jack Shirazi의 자바 성능 튜닝 2 판 참조).

+0

예, 당신이 옳다고 생각합니다. GC를 속이는 것 아닌가요? 제가 의미하는 바는 GC가 진행 중이라는 것은 메모리에만 더 이상의 참조가 없다는 것을 의미합니다. Object의 메모리가 다른 Object의 참조를 보유하면 GC에 적합합니다.finalize 메소드의 정확한 목적은 무엇입니까? – Kumar

+1

@Kumar Finalize 메서드는 수집 할 개체를 강제로 사용하지 않고 자동 저장 관리자가 자동으로 해제 할 수없는 리소스를 확보하는 데 사용됩니다. 나는 이것을 사용하지 않는다. 나는 드문 경우에 유용하다고 생각한다. 블로그 링크에서 볼 수 있듯이 finally 문을 사용하고 여기에서 ressource를 릴리스 할 수 있습니다 (예 : InputStream, Reader 등). –

+0

제 코멘트를 다시 틀어 줘야 할 것 같아요, 이건 마치 GC가 진행 중이고 객체 메모리가 재생 중입니다. 그것은 finilaze 방법을 가지고있다. 예외가 발생하면 GC가 메모리를 지우지 않습니다. 자바에서 허점이 아닙니다. 그리고 다음 질문은, 일반적으로 사람들은 "마무리"방법은 자원을 청소하는 데 쓰는 것입니다, 그래서 내 질문은 한 개체가 어떤 자원에 대한 참조를 가지고 있는지에 대한 것입니다, 그렇다면 어떻게 다루어 질 것인가? GC에 의한 참조. – Kumar

0

"finalize 메서드로 throw 된 예외로 인해이 개체의 종료가 중지되지만 그렇지 않으면 무시됩니다." http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#finalize()

+0

* 명확한 * 요약은 거칠게 불완전하고 정확하지 않으며 실제로 일어나는 것을 오판합니다. –

+0

자세한 내용을 보려면 아래 토론에 참여하십시오. – Kumar

+0

@ Jarrod : 네 말이 맞아. 미안해. 내 대답이 서둘 렸어. 나는 예외가 던져지면 그 객체가 여전히 수집 될 것이라는 나의 이해를 가로막 으려고 노력했다. 도움이되지 않는 요약을 삭제했습니다. –