JVM 메모리 분석 시리즈 (5)finalize() 방법에 대한 간단한 설명
1886 단어 finalize
첫 번째 태그를 표시할 때 한 번의 선별이 진행됩니다. 선별의 조건은finalize () 방법을 실행할 필요가 있는지 여부입니다.
대상이finalize () 방법을 덮어쓰지 않았거나finalize () 가 가상 기기에서 호출되었을 때, 가상 기기는finalize () 방법을 실행할 필요가 없다고 생각합니다.
이 대상이finalize () 를 실행할 필요가 있다면, 하나의 대기열에 놓고, 낮은 우선순위의 라인으로finalize () 방법을 2차 표시합니다.finalize () 방법에서 대상이 인용체인에 다시 되돌아오면 (예를 들어this가 다른 인용체인에 부여한 대상), 대상은 회수되지 않고 이 대기열로 이동합니다.
주의:finalize () 방법은 한 번만 호출됩니다. 만약 이 대상이 GC에서 finalize () 방법을 한 번 호출한 적이 있다면, 두 번째 GC에서finalize () 를 실행할 필요가 없다고 판단되어 직접 회수됩니다.
또한finalize()가 할 수 있는 모든 일은try-finally를 통해 더 좋고 제때에 해결할 수 있습니다.그러니 finalize()를 잊으세요.
package System.gc;
/**
* @author piaohailin
* @date 2013-12-28
*/
public class TestGc {
public static TestGc HOOK;
@Override
protected void finalize() throws Throwable {
super.finalize();
TestGc.HOOK = this;
System.out.println("finalize");
}
/*
finalize
HOOK is alvie
HOOK is dead
*/
public static void main(String[] args) throws Exception {
HOOK = new TestGc();
HOOK = null;
System.gc();// GC, finalize
Thread.sleep(1000);//Finalizer ,
if (HOOK != null) {
System.out.println("HOOK is alvie");
} else {
System.out.println("HOOK is dead");
}
HOOK = null;
System.gc();// GC, finalize,
Thread.sleep(1000);//Finalizer ,
if (HOOK != null) {
System.out.println("HOOK is alvie");
} else {
System.out.println("HOOK is dead");
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Finalize와 Dispose의 분석사용자 정의 클래스에서 Finalize () 를 다시 쓸 때 쓰레기 수거기는 메모리에서 이 대상을 삭제하기 전에 대상의 Finalize () 방법을 호출할 수 있습니다.구조 유형은 Finalize()를 다시 쓸 수 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.