강약연허 인용weakHashMap

5534 단어 java 학습 노트JVM

억지로 인용하다


이것은 가장 흔히 볼 수 있는 인용 관계입니다. 변수 o는 new object()라는 대상(이하 대상 xx)을 인용합니다. o는 대상의 강한 인용을 가지고 있습니다. 메모리가 넘칠지언정 강한 인용의 메모리를 제거하지 않습니다.
Object obj = new Object();//o      new    xx    
//       obj  null,    xx      ,     ,    gc      
obj = null;//help GC

obj를null로 설정한 경우 대상 xx에 대한 인용 처리를 계속하려면 다시 new 하나만 나올 수 있습니다. 이런 장면에서 jdk1.2 뒤에 자바가 하나 나왔어요.lang.ref 패키지는 대상의 생명주기에 대한 제어를 강화하는 동시에 자바의 내장 캐시로서 인용이 불가능한 상황에서도 사용할 수 있다

소프트 참조 SoftReference


SoftReference에 잃어버리면 소프트 인용입니다. 메모리가 넘칠 것 같으면 소프트 인용을 제거합니다.
    @Test
    public void test1() throws Exception {
        //////////   
        Object obj = new Object();
        ReferenceQueue queue = new ReferenceQueue();
        SoftReference softReference = new SoftReference(obj,queue);
        System.out.println("  obj:" + obj);//java.lang.Object@32a1bec0
        obj = null;//     
        System.gc();//  gc
        Thread.currentThread().sleep(1000);//  gc  
        System.out.println("null obj:" + obj);
//        queue.poll();//     gc       queue   poll                   
        System.out.println("    get :" + softReference.get());//       gc  java.lang.Object@32a1bec0

        //////////   
        Object obj2 = new Object();
        WeakReference weakReference = new WeakReference(obj2,queue);
        obj2 = null;
        System.gc();
        Thread.currentThread().sleep(1000);
        System.out.println("    get :" + weakReference.get());//        gc null     queue    }

비고정 참조WeakReference


GC를 실행하면 지워집니다.

거짓 인용


사용량이 적다
여러 인용 관계가 병존할 때 그것을 기준으로 할까요?강인용>소프트 인용>약인용>허인용은 당연히 강한 것을 위주로 한다. 예를 들어 앞 코드의obj가null이 아니라면obj가 소프트/약인용이 있어도 그 대상은 강인용이다.

GC 상호작용 원리


개인적인 추측에 의하면 gc 베이스 알고리즘에서 각종 서로 다른 인용에 대해 잘못된 알고리즘을 사용하고 서로 다른 GCroot에 대해 전략을 써서 gc와queue의 상호작용을 대할 것이다. Reference/ReferenceQue의 원본 코드를 봐도 GC가 왜 데이터를queue에 버렸는지 모르겠다. Reference의 수호 라인은 상태를 바꾸는 것일 뿐이고 GC 베이스 알고리즘이기도 하다.

WeakHashMap


이름을 보면 약한 인용과 큰 관계가 있음을 알 수 있습니다. 많은 프레임워크가 이 맵 내부의 Entry를 사용하여 하나를 유지하는 것을 발견했습니다.
/**
     * The entries in this hash table extend WeakReference, using its main ref
     * field as the key.
     */
    private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> {
        V value;
        final int hash;
        Entry next;

        /**
         * Creates new entry.
         */
        Entry(Object key, V value,
              ReferenceQueue queue,
              int hash, Entry next) {
            super(key, queue);
//        key      key  null         value  
            this.value = value;
            this.hash  = hash;
           xt  = next;
        }}
     * 
     /**
     * Expunges stale entries from the table.get/size   map         
     */
    private void expungeStaleEntries() {
        for (Object x; (x = queue.poll()) != null; ) {
            synchronized (queue) {
    //queue.poll() queue     x,    map key   map     entry      
    }

참고 자료https://blog.csdn.net/coolwxb/article/details/7939246

좋은 웹페이지 즐겨찾기