WeakHashMap에서 몇 가지 문제가 발생했습니다.전체 GC 동안 WeakHashMap이 지워졌습니까?
이List<byte[]> list = new ArrayList<byte[]>();
Map<String, Calendar> map = new WeakHashMap<String, Calendar>();
String anObject = new String("string 1");
String anOtherObject = new String("string 2");
map.put(anObject, Calendar.getInstance());
map.put(anOtherObject, Calendar.getInstance());
// In order to test if the weakHashMap works, i remove the StrongReference in this object
anObject = null;
int i = 0;
while (map.size() == 2) {
byte[] tab = new byte[10000];
System.out.println("iteration " + i++ + "map size :" + map.size());
list.add(tab);
}
System.out.println("Map size " + map.size());
이 코드는 작동합니다
이 샘플 코드를 살펴 보자. 루프 내에서 객체를 생성합니다. 마이너 GC가 발생하면 1360 번째 반복에서 맵 크기가 1과 같습니다. 다 괜찮아. 내가이 줄을 주석 이제다음 mapSize는 그러나 26XXX 회 반복 항상 2와 동일하기 때문에 내가 OutOfMemoryError가있을 것으로 예상
//anObject = null;
는 전체 GC가 발생하고지도의 크기는 같다 이유는 모르겠다.
두 개체에 대한 강력한 참조가 있으므로지도를 지워서는 안된다고 생각했습니다.
루프가 아직 실행 중에 컴파일러, 코드 분석anObject
및
anOtherObject
루프 이후에 사용되지 않는 것으로보고, 로컬 변수 테이블에서 제거 또는
null
로 설정하는 적시
테스트가 올바르지 않다고 생각합니다. 'while (map.size() == 2) {'를 while (map.size()> 0) {'로 변경하면 두 테스트는지도가 비어있을 때까지 끝날 것입니다. = null' 또는 아닌지. BTW, 나는 이미 그것을 시도했다. – donnior
끝에'anObject'와'anOtherObject'를 출력하십시오. 컴파일러는 더 이상 사용하지 않고 이전에 제거 할 수 있음을 확인합니다. –