JVM 메모리 분석 시리즈 (5)finalize() 방법에 대한 간단한 설명

1886 단어 finalize
루트 검색 알고리즘에서 도달할 수 없는 대상은 회수하기 전에 2차 표시를 해야 한다.
첫 번째 태그를 표시할 때 한 번의 선별이 진행됩니다. 선별의 조건은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");
        }
    }

}

좋은 웹페이지 즐겨찾기