Tôi gặp phải một số sự cố với WeakHashMap.WeakHashMap có bị xóa trong toàn bộ GC không?
xem xét mẫu mã này:
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());
Mã này hoạt động. Bên trong vòng lặp, tôi đang tạo đối tượng.Khi một GC nhỏ xảy ra, kích thước bản đồ bằng 1 ở lần lặp 1360. Tất cả đều ổn.
Bây giờ khi tôi bình luận dòng này:
//anObject = null;
Tôi hy vọng sẽ có một OutOfMemoryError vì mapSize luôn bằng 2. Tuy nhiên tại phiên thứ 26XXX, một GC đầy đủ xảy ra và kích thước bản đồ bằng 0. Tôi không hiểu tại sao?
Tôi nghĩ rằng bản đồ không nên bị xóa vì cũng có các tham chiếu mạnh mẽ cho cả hai đối tượng.
Tôi nghĩ thử nghiệm của bạn không chính xác. Nếu bạn thay đổi 'while (map.size() == 2) {' thành 'while (map.size()> 0) {', hai phép thử sẽ kết thúc cho đến khi bản đồ trống, bất kể bạn nhận xét 'anObject = null' hay không. BTW, tôi đã thử nó rồi. – donnior
In 'anObject' và' anOtherObject' ở cuối. Trình biên dịch thấy rằng bạn không còn sử dụng chúng nữa và có thể xóa chúng trước đó. –