WeakHashMap 사용 소계

단기판 시스템에서 간단한 캐시 기능(분포식 캐시 시스템을 사용하지 않음)을 실현해야 한다. 메모리에서 하나의 맵으로 실현하면 된다. 일반적인 맵은 링크드 해시맵도 위크 해시맵으로 실현할 수 있다. 그들의 차이점은 탈락 메커니즘에 있다. 전자는 구축할 때 밸브값을 설정하거나 회수할 때 그 대상이 우선적으로 회수되는 것을 결정할 수 있다.밸브값이 나오면 늙은 대상의 탈락 여부를 결정한다.후자인 WeakHashMap은 가상 기기의 쓰레기 회수 메커니즘을 바탕으로 도태된 것으로 회수할 때 용기 중 어느 대상이 회수에 대해 GC에 의해 완전히 결정된다.
여기서 몇 가지 코드를 통해 WeakHashMap의 특성을 설명하는데 첫 번째 코드는 순조롭게 실행할 수 있다.
 
	public void test1() throws Exception {
		//List<byte[][]> keys = new ArrayList<byte[][]>();
		byte[][] key = null;
		WeakHashMap<byte[][], byte[][]> maps = new WeakHashMap<byte[][], byte[][]>();
		for (int i = 0; i < 10000; i++) {
			key = new byte[1000][1000];
			
			maps.put(key, new byte[1000][1000]);

			// System.gc();
			System.err.println(i);

			System.err.println(" size" + maps.size());

		}
	}

출력 결과에서 알 수 있듯이 사이즈의 크기는 작은 것에서 큰 것으로, 갑자기 작아진 다음에 작은 것에서 큰 것으로 변한다.이것은 쓰레기 수거기의 작용을 설명한다. 이것은 jdk의 설명 문서와 일치한다.
 
 
/ * An entry in a <tt>WeakHashMap</tt> will automatically be removed when
 * its key is no longer in ordinary use.  More precisely, the presence of a
 * mapping for a given key will not prevent the key from being discarded by the
 * garbage collector, that is, made finalizable, finalized, and then reclaimed.
 * When a key has been discarded its entry is effectively removed from the map,
 * so this class behaves somewhat differently from other <tt>Map</tt>
 * implementations.
*/

 
 
GC가 회수를 시작할 때 맵의 키가 사용되지 않는 것을 발견할 수 있습니다. 맵에 키와value의 맵이 존재하더라도 맵의 키가 GC에서 회수되는 것을 막을 수 없습니다.맵의 키가 회수되면,value 대상도 순조롭게 회수됩니다.
 
다음 코드를 다시 보십시오.
 
	public void test2() throws Exception {
		List<byte[][]> keys = new ArrayList<byte[][]>();
		byte[][] key = null;
		WeakHashMap<byte[][], byte[][]> maps = new WeakHashMap<byte[][], byte[][]>();
		for (int i = 0; i < 10000; i++) {
			key = new byte[1000][1000];
			keys.add(key);
			maps.put(key, new byte[1000][1000]);

			// System.gc();
			System.err.println(i);

			System.err.println(" size" + maps.size());

		}
	}

Test2 () 를 절반까지 실행하면 OOM 이상이 발생합니다. 이 코드는 이전 코드와 유일한 차이점은 맵의 키를 하나의list에 넣으면 방법체의 모든 키가 인용될 수 있기 때문에 쓰레기 회수를 시작할 때 weak의 키가 자동으로 회수되지 않기 때문에 OOM은 불가피합니다.
 
   
따라서 WeakHashMap을 사용할 때 어떤 키를 사용하면 대상이 자동으로 회수되기를 원하면 맵의 키와 모든 인용 관계를 끊어야 합니다.

좋은 웹페이지 즐겨찾기