가능한 중복은 : 객체가 메모리에서 해제하려고 할 때
method finalize and exceptions예외
가비지 컬렉터 finalize()
메소드를 호출한다. finalize()
메소드에서 예외가 발생하면 어떻게됩니까?
GC가 더 진행되어 메모리를 해제합니까, 그렇지 않으면 GC가 해당 개체의 프로세스를 중단할까요?
가능한 중복은 : 객체가 메모리에서 해제하려고 할 때
method finalize and exceptions예외
가비지 컬렉터 finalize()
메소드를 호출한다. finalize()
메소드에서 예외가 발생하면 어떻게됩니까?
GC가 더 진행되어 메모리를 해제합니까, 그렇지 않으면 GC가 해당 개체의 프로세스를 중단할까요?
try-catch 문에서 예외가 발생하고 올바르게 catch 된 경우 예, 일반 프로그램에서와 마찬가지로 "GC가 더 진행됩니다". 캐치되지 않는 예외가 마무리 중에 발생되는 경우 JSL에 따라
그러나 발생한 예외는 다음 처리되지 않는 경우
,는, 예외는 무시되어 오브젝트의 파이 나라 이즈는 종료합니다.
따라서이 경우 "GC가 해당 개체의 프로세스를 중단합니다."경우 일부 리소스가 올바르게 릴리스되지 않았을 수 있습니다. 그런데
는 파이널 2 단점이 있습니다 :경우 생성 위를 할 이유는 finalize 메소드 이제까지
(this blog에서) 실행됩니다 당신은 확신 할 수 없다 가비지 컬렉터는 객체와 관련된 메모리를 확보하기 전에 항상 finalize를 호출합니다. 그 이유는 가비지 수집기가 JVM이 종료되기 전에 항상 객체를 정리할 기회를 얻지 못하기 때문입니다.
종료 자 힘 객체 (즉 수집하는 데 시간이 더 소요) 오래된 공간으로 승격하고, 파이널 라이저가 실행될 때까지 GC의 algotithm에 더 많은 오버 헤드를 추가하여 GC를 연기한다. (Jack Shirazi의 자바 성능 튜닝 2 판 참조).
예, 당신이 옳다고 생각합니다. GC를 속이는 것 아닌가요? 제가 의미하는 바는 GC가 진행 중이라는 것은 메모리에만 더 이상의 참조가 없다는 것을 의미합니다. Object의 메모리가 다른 Object의 참조를 보유하면 GC에 적합합니다.finalize 메소드의 정확한 목적은 무엇입니까? – Kumar
@Kumar Finalize 메서드는 수집 할 개체를 강제로 사용하지 않고 자동 저장 관리자가 자동으로 해제 할 수없는 리소스를 확보하는 데 사용됩니다. 나는 이것을 사용하지 않는다. 나는 드문 경우에 유용하다고 생각한다. 블로그 링크에서 볼 수 있듯이 finally 문을 사용하고 여기에서 ressource를 릴리스 할 수 있습니다 (예 : InputStream, Reader 등). –
제 코멘트를 다시 틀어 줘야 할 것 같아요, 이건 마치 GC가 진행 중이고 객체 메모리가 재생 중입니다. 그것은 finilaze 방법을 가지고있다. 예외가 발생하면 GC가 메모리를 지우지 않습니다. 자바에서 허점이 아닙니다. 그리고 다음 질문은, 일반적으로 사람들은 "마무리"방법은 자원을 청소하는 데 쓰는 것입니다, 그래서 내 질문은 한 개체가 어떤 자원에 대한 참조를 가지고 있는지에 대한 것입니다, 그렇다면 어떻게 다루어 질 것인가? GC에 의한 참조. – Kumar
"finalize 메서드로 throw 된 예외로 인해이 개체의 종료가 중지되지만 그렇지 않으면 무시됩니다." http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#finalize()
* 명확한 * 요약은 거칠게 불완전하고 정확하지 않으며 실제로 일어나는 것을 오판합니다. –
자세한 내용을 보려면 아래 토론에 참여하십시오. – Kumar
@ Jarrod : 네 말이 맞아. 미안해. 내 대답이 서둘 렸어. 나는 예외가 던져지면 그 객체가 여전히 수집 될 것이라는 나의 이해를 가로막 으려고 노력했다. 도움이되지 않는 요약을 삭제했습니다. –
Java 코드에'finalize()'메소드를 쓰는 이유는 무엇입니까? 대부분의 경우 모두 나쁜 습관입니다. –
아니요. 내 지식을 위해서 그런 방법을 쓰지 않았습니다. – Kumar