?????宓� 4 ???? hprof ??????????????????? Map.Entry ????????????????????????????????????些???????????? Map.Entry ???????????些???????????????泄????????????????????

?????宓� 4. HPROF ???????? Map.Entry ?????????


TRACE 300446:
 java.util.HashMap$Entry.(:Unknown line)
 java.util.HashMap.addEntry(:Unknown line)
 java.util.HashMap.put(:Unknown line)
 java.util.Collections$SynchronizedMap.put(:Unknown line)
 com.quiotix.dummy.MapLeaker.newTask(MapLeaker.java:48)
 com.quiotix.dummy.MapLeaker.main(MapLeaker.java:64)
???????????????

????SocketManager ???????? Socket-User ????????????????? Socket ?????????????????????????????魏??????????????????????贸????貌??????????????????????????????? JDK 1.2 ?????????????????????????????????????????????????????????????????????????????????????泄? —— ?????????谩?

??????????????????????? referent???????????????????????煤????????? referent ?????????????????????????????????????????????????????????????????????????????????? referent ?????????????????????????魏????????????????????????????????????????????????????????????????weakly reachable??????

????WeakReference ?? referent ??????????????????斜?????????????? get() ???????????????????????????????? referent ???????????????????????????? WeakReference.clear()????get() ???? null?????????????????????????????? get() ?????????? null ?????? referent ?????????????????

??????????????????????????????????????????? referent ???????????????????????????????????????????????小????????????????????????????? —— ?????????????????????????械??????????妫�????????????????????????????????? referent ??????????????????????????????????????????????????

???????????????????????????????些????贸???????????????????娲�??????些?????????????? —— ???? SocketManager ??????????????????????????贸??????梅???WeakHashMap ??????? JDK 1.2 ??????校??????????????????????????谩???????????? HashMap ?????????????????????????????????? Map ?????????????????WeakHashMap ??????????????????? Map ??????????????????????????????宓� 5 ?????? WeakHashMap ?? get() ?????????????????????????????????

?????宓� 5. WeakReference.get() ???????????


public class WeakHashMap implements Map {
    private static class Entry extends WeakReference
      implements Map.Entry {
        private V value;
        private final int hash;
        private Entry next;
        ...
    }
    public V get(Object key) {
        int hash = getHash(key);
        Entry e = getChain(hash);
        while (e != null) {
            K eKey= e.get();
            if (e.hash == hash && (key == eKey || key.equals(eKey)))
                return e.value;
            e = e.next;
        }
        return null;
    }