자바 의 네 가지 인용 유형 을 약술 하 다.

간단 한 소개
JDK 1.2 버 전부터 대상 의 인용 을 네 가지 단계 로 나 누 어 프로그램 이 대상 의 생명 주 기 를 더욱 유연 하 게 제어 할 수 있 도록 한다.이 네 가지 단 계 는 높 은 것 에서 낮은 것 으로 나 뉜 다.강 한 인용,부 드 러 운 인용,약 한 인용 과 허 인용 이다.다음은 이 네 가지 인용 을 소개 한다.
억지로 인용 하 다
강 한 인용 은 가장 자주 사용 되 는 인용 형식 입 니 다.다음 과 같이 new Object()는 Object 대상 을 만 들 고 더미 에 저장 합 니 다.변수 object 는 이 대상 에 대한 강 한 인용 을 저장 합 니 다.

Object object = new Object();
강 한 인용 은 쓰레기 로 회수 되 지 않 기 때문에 이 대상 을 회수 하려 면 이 대상 을 가리 키 는 변 수 를 null 로 표시 해 야 합 니 다.그러면 이 대상 은 강 한 인용 에서 무 인용 으로 바 뀌 어야 합 니 다.
예시:

public class ReferenceDemo {
    public static void main(String[] args) throws IOException {
        //          
        ReferenceDemo referenceDemo = new ReferenceDemo();
        //         ,         
        referenceDemo = null;
        //      
        System.gc();
        //     ,          
        System.in.read();
    }

    //         
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("-----finalize-----");
    }
}
소프트 인용
소프트 인용 은 SoftReference 를 사용 하여 만 든 것 으로 메모리 공간 이 충분 한 경우 소프트 인용 은 회수 되 지 않 으 며,메모리 공간 이 부족 한 가상 컴퓨터 가 OutOfmory Error 를 던 지기 전에 소프트 인용 은 회수 된다.
예시:

public class ReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        //  ReferenceDemo      
        SoftReference<ReferenceDemo> softReference = new SoftReference<>(new ReferenceDemo());
        //      
        System.gc();
        //     ,          
        Thread.sleep(5000);
        //softReference.get()       ,           ,   null
        System.out.println(softReference.get());

        //  25M     
        byte[] bytes = new byte[1024 * 1024 * 25];
        //      ,     ,          
        Thread.sleep(5000);
        //         
        System.out.println(softReference.get());
    }
}

/*
 *     :
 * com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
 * null
 */
메모:예제 가 실행 되 기 전에 메모리 크기 를 30m(-Xmx30m-Xms30m)로 설정 해 야 합 니 다.
용도:소프트 인용 은 메모리 공간 에 민감 한 캐 시 에 사용 할 수 있 습 니 다.캐 시 대상 은 메모리 공간 이 부족 해서 회수 할 때 까지 계속 저장 합 니 다.
약 인용
약 한 인용 은 Weak Reference 를 사용 하여 만 든 것 으로 쓰레기 회수 스 레 드 실행 과정 에서 약 한 인용 을 찾 으 면 메모리 공간 이 충분 하 든 약 한 인용 대상 은 회수 된다.쓰레기 회수 스 레 드 는 우선 순위 가 낮은 스 레 드 이기 때문에 약 한 인용 만 있 는 대상 을 빨리 발견 할 수 있 는 것 은 아니다.
예시:

public class ReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        //  ReferenceDemo    
        WeakReference<ReferenceDemo> weakReference = new WeakReference<>(new ReferenceDemo());
        //weakReference.get()       ,           ,   null
        System.out.println(weakReference.get());

        //      
        System.gc();
        //     ,          
        Thread.sleep(3000);

        //         
        System.out.println(weakReference.get());
    }
}

/*
 *     :
 * com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
 * null
 */
용도:약 한 인용 도 캐 시 에 사용 할 수 있 으 며,Weak HashMap 류 를 참고 할 수 있 습 니 다.
거짓 인용
가상 인용 은 Phantom Reference 를 사용 하여 만 든 것 이기 때문에 인용 유형 중 가장 약 합 니 다.가상 인용 대상 은 인용 되 지 않 은 대상 과 같 으 며,언제든지 쓰레기 로 회수 할 수 있 으 며,가상 인용 은 인용 대기 열 과 함께 사용 해 야 합 니 다.
쓰레기 수 거 스 레 드 가 가상 인용 대상 을 회수 할 때 쓰레기 수 거 후 이 대상 을 없 애고 Phantom Reference 를 인용 대기 열 에 추가 합 니 다.
예시:

public class ReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        //      
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue();
        //  ReferenceDemo    
        PhantomReference<ReferenceDemo> phantomReference = new PhantomReference<>(new ReferenceDemo(), referenceQueue);
        //phantomReference.get()    null
        System.out.println("phantomReference.get():" + phantomReference.get());
        //     ,        Reference  ,       ,    null
        System.out.println("referenceQueue.poll():" + referenceQueue.poll());

        //      
        System.gc();
        //     ,          
        Thread.sleep(3000);
        System.out.println("------      ------");

        System.out.println("phantomReference.get():" + phantomReference.get());
        System.out.println("referenceQueue.poll():" + referenceQueue.poll());
    }
}

/*
 *     :
 * phantomReference.get():null
 * referenceQueue.poll():null
 * ------      ------
 * phantomReference.get():null
 * referenceQueue.poll():java.lang.ref.PhantomReference@76fb509a
 */
용도:가상 인용 은 대상 이 메모리 에서 언제 삭제 되 는 지 정확하게 검사 하 는 데 사용 할 수 있 으 며,인용 대기 열 을 검사 하여 대상 이 회수 되 었 는 지 여 부 를 판단 할 수 있 습 니 다.
이상 은 자바 의 네 가지 인용 유형 에 대한 상세 한 내용 을 요약 하 는 것 입 니 다.자바 인용 유형 에 관 한 자 료 는 다른 관련 글 에 주목 하 시기 바 랍 니 다!

좋은 웹페이지 즐겨찾기