Object.java의 finalize는 빈 함수입니다. 개체 정리 작업은 어디에 있습니까?
가비지 컬렉터의 일부로 JVM 내부. 이 논리에 액세스 할 권한이 없습니다.
개체가 가비지 수집 될 때 Finalizer가 호출됩니다. 바를 불러서는 안된다는 뜻입니다. 어떻게 바가 여전히 인쇄되고 있습니까?
정확하게는 아닙니다. finalize()
은 객체에 참조가없는 (즉, 수집 할 준비가 된) 시점과 VM이 효율적으로 회수하기로 결정한 시점 사이의 어느 시점에서 호출되었지만 효율적으로 수행하기 전에 호출됩니다. finalize()
은 "막대"를 인쇄 할 수있을뿐만 아니라 이전에 수집 대상인 객체 또는 다른 객체를 "활성"상태로 만드는 참조를 설정 (매우 간단한 예제로 AClass.aStaticField= this ;
을 실행하여 참조)하기 때문에 중요합니다. 이러한 이유로 가비지 수집에 대한 개체의 적합성이 finalize()
후에 다시 검사되고 수집이 중단 될 수 있습니다. 이렇게하면 객체가 가비지 수집을 거부 할 수는 있지만 영원히 남을 수는 없습니다 (아래 참조).
finalize() 이해에 도움이되는 다른 아이디어가 있습니까?
- 그것은 모든에서 소멸자 에 해당하지 않습니다.
- 주로 역사적인 이유로 존재합니다. 최초의 아이디어는 개체를 수집하기 전에 개체에 리소스 (TCP 연결, 열린 파일 등)를 정리할 기회를 제공하는 것이 었습니다. 그러나 객체 "release"와
finalize()
사이를 통과 할 수있는 기간은 매우 가변적이어서 close()
메소드를 통한 명시 적 자원 할당 해제가 선호 ("Javatic"?) 방식이되었고 finalize()
사용이 권장되지 않았습니다. 실제로 많은 JVM은 종료 할 때 finalize()
메서드를 호출하지 않습니다. - 위에서 언급 한 좋은 예제 중 하나는 Java 7에서 도입 된 "try with resources"구조입니다. 대조적으로
finalize()
에 의해 제시된 문제를 해결하기위한 작업은 없습니다. 이제까지. finalize()
의 기능은 자체 개체뿐만 아니라 다른 개체도 "부활"시킬 수 있습니다. 그 결과는 완전히 지정되지 않았습니다. 에이 지정되어있는 경우 : "주어진 객체에 대해 Java 가상 머신이 finalize 메소드를 두 번 이상 호출하지 않습니다." ". 즉, finalize()
이 자체 개체를 "부활"하면 해당 개체가 다시 수집 할 준비가 되었음에도 두 번째로 호출되지 않습니다. 적어도 호기심을 자극하는 행동. 사실 객체가 수집되는 동안 Java가 순서를 보장하지 않으므로 두 객체가 이런 방식으로 상호 작용하면 무작위입니다. - 요약 : 은이 아닙니다.
finalize()
을 사용하십시오. 당신이 그랬다면, 당신은 그것에 의존하는 최초의 사람 중 하나가 될 것입니다. 아이디어는 원칙적으로 좋았지 만, 시간이 지남에 분명해진 결과를 기대할 수있는 방법이 없었습니다. 명시 적 close()
리소스 정리 방법을 정의하십시오. 어떤 경우에는 자원 사용을 모니터하는 정리 스레드가 유용 할 수도 있습니다.
PS : 매우 유사 뭔가 Thread.suspend()
, Thread.resume()
, Thread.stop()
및 Thread.destroy()
일어났다. 매우 훌륭한 아이디어는 응용 프로그램과 JVM 안정성면에서 야식을 증명했습니다. 유일한 차이점은 이러한 Thread
메서드는 공식적으로 그 영향이 (논쟁의 여지없이) 크기 때문에 더 이상 사용되지 않습니다.
"something ordinary mortal"xD – nachokk