2008-08-26 4 views
16

내 프로그램 코드의 개체에 finalize()을 호출하면 가비지 수집기가이 개체를 처리 할 때 JVM이 메서드를 다시 실행합니까?Java 및 수동으로 실행 완료

MyObject m = new MyObject(); 

m.finalize(); 

m = null; 

System.gc() 

finalize()에 대한 명시 적 호출이 JVM의 가비지 컬렉터가 객체 mfinalize() 방법을 실행하지 만들 것 :

이 대략 예를 들어 있을까?

답변

30

이 간단한 테스트 프로그램에 따르면, JVM은 여전히 ​​것 그 당신이 명시 적으로 호출하는 경우에도) (마무리 호출

출력은 다음과 같습니다

시작
마무리!
마무리 중!
명시 적으로) (거기에 모든 자원이 마무리 호출하지 않습니다 말한다

수행하고, 호출 할 때 경우에 대해 어떠한 보장이 없기 때문에 거의 심지어 메소드를 구현하지 않습니다. 모든 리소스를 수동으로 닫는 것이 좋습니다.

1

finalize 메소드는 지정된 객체에 대해 JVM에 의해 두 번 이상 호출되지 않습니다. 어쨌든 완료 될 것이라는 보장이 없기 때문에 마무리 작업에 의존해서는 안됩니다. 당신은 당신이 별도의 방법에 넣어 그것을 명시 적으로, 예를 들면 만들기 위해 더 좋은 정리 코드를 실행해야하기 때문에 마무리 호출하는 경우 :

public void cleanUp() { 
    . 
    . 
    . 
} 

myInstance.cleanUp(); 
6

마무리 기능을 이해하려면 가비지 수집기 (GC) 워크 플로를 이해해야합니다. .finalize()를 호출해도 가비지 컬렉터가 호출되지 않고 system.gc도 호출되지 않습니다. 사실, 어떤 마무리는 코더가 객체 참조를 "참조되지 않음"으로 선언하는 데 도움이됩니다.

GC는 JVM의 실행 중 일시 중단을 강제합니다. 이로 인해 성능이 저하됩니다. 작동 중에 GC는 루트 객체 (기본 메소드 호출)에서 시작하여 참조 된 모든 객체를 트래버스합니다. 객체가 수동으로 참조되지 않는 것으로 선언하면이 일시 중단 시간을 줄일 수 있습니다. 이는 객체 참조가 자동화 된 런에 의해 더 이상 사용되지 않는다고 선언하기 위해 작업 비용을 줄이기 때문입니다. finalize()를 선언하면 코더는 객체에 대한 참조를 쓸모 없게 설정하므로 다음 GC 실행에서 GC 실행은 작업 시간을 사용하지 않고 객체를 스윕합니다.

인용구 : "개체에 대해 finalize 메서드가 호출 된 후 Java 가상 컴퓨터가 더 이상이 개체에 액세스 할 수있는 방법이 없음을 확인할 때까지 더 이상의 작업이 수행되지 않습니다. 오브젝트가 파기 될 가능성이있는 다른 오브젝트 또는 클래스에 의한 가능한 액션을 포함 해, 아직 죽지 않았다. "java.Object.finalize()의 Java API Doc로부터.

자세한 내용은 다음을 확인하시기 바랍니다. javabook.computerware