WeakHashMap 사용 소계
2617 단어 cache캐시WeakHashMap
여기서 몇 가지 코드를 통해 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을 사용할 때 어떤 키를 사용하면 대상이 자동으로 회수되기를 원하면 맵의 키와 모든 인용 관계를 끊어야 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redis 및 캐시캐시는 클라이언트에 대한 반복 데이터를 저장할 수 있는 메모리 내 데이터 저장소입니다. Redis와 같은 메모리 내 캐시 시스템을 사용하면 물리적 RAM에 데이터를 저장할 수 있습니다. 즉, 캐시에서 데이터에 액세스...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.