문제

내 프로그램 코드에서 개체에 대해 finalize()를 호출하면 가비지 수집기가이 개체를 처리 할 때 JVM 이 여전히 메서드를 다시 실행합니까?

대략적인 예입니다. 라코 디스

finalize()를 명시 적으로 호출하면 JVM 의 가비지 수집기가 finalize() 개체에서 m 메소드를 실행하지 않게 되나요?

도움이 되었습니까?

해결책

이 간단한 테스트 프로그램에 따르면 JVM은 명시 적으로 호출하더라도 finalize ()를 계속 호출합니다. 라코 디스

출력은 다음과 같습니다. <인용구>

시작
마무리!
마무리!
완료

모든 리소스는 절대로 finalize ()를 명시 적으로 호출하지 말라고 말하며, 호출 여부와시기에 대한 보장이 없기 때문에 메소드를 구현하지도 않습니다.모든 리소스를 수동으로 닫는 것이 좋습니다.

다른 팁

종료 기능을 이해하려면 가비지 수집기 (GC) 워크 플로를 이해해야합니다. .finalize () 호출은 가비지 수집기를 호출하거나 system.gc를 호출하지 않습니다. 실제로 finalize는 코더가 개체의 참조를 "참조되지 않음"으로 선언하는 데 도움이됩니다.

GC는 JVM의 실행 작업을 강제로 중단하여 성능을 저하시킵니다. 작동 중에 GC는 루트 개체 (기본 메서드 호출)에서 시작하여 참조 된 모든 개체를 순회합니다. 이 일시 중지 시간은 개체를 참조되지 않은 것으로 수동으로 선언하여 줄일 수 있습니다. 자동 실행에 의해 사용되지 않는 개체 참조를 선언하는 작업 비용을 줄일 수 있기 때문입니다. finalize ()를 선언함으로써 coder는 사용되지 않는 객체에 대한 참조를 설정하므로 다음에 GC 작업을 실행할 때 GC 실행은 작업 시간을 사용하지 않고 객체를 스윕합니다.

인용문 : "객체에 대해 finalize 메소드가 호출 된 후, Java 가상 머신이 더 이상이 객체에 액세스 할 수있는 방법이 없음을 다시 판단 할 때까지 추가 조치를 취하지 않습니다. 완료 될 준비가 된 다른 객체 또는 클래스에 의한 가능한 작업을 포함하여 아직 죽었습니다.이 시점에서 객체는 폐기 될 수 있습니다. "from Java API Doc on java.Object.finalize ();

자세한 설명은 다음에서 확인할 수도 있습니다. javabook.computerware

finalize 메소드는 주어진 객체에 대해 JVM에 의해 두 번 이상 호출되지 않습니다.호출 될 것이라는 보장이 없기 때문에 어쨌든 finalize에 의존해서는 안됩니다.정리 코드를 실행해야하기 때문에 finalize를 호출하는 경우 별도의 메서드에 넣고 명시 적으로 만드는 것이 좋습니다. 예 : 라코 디스

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top