Ho riscontrato dei problemi con WeakHashMap.WeakHashMap è stato cancellato durante un GC completo?
Considerate questo codice di esempio:
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());
questo codice funziona. All'interno dei loop, sto creando un oggetto. Quando si verifica un GC secondario, la dimensione della mappa è uguale a 1 alla 1360a iterazione. Va tutto bene.
Ora, quando io commento questa linea:
//anObject = null;
mi aspetto di avere un OutOfMemoryError perché il mapSize è sempre uguale a 2. Tuttavia al esima iterazione 26XXX, si verifica un GC pieno e la dimensione della mappa è uguale a 0. Non capisco perché?
Ho pensato che la mappa non avrebbe dovuto essere cancellata perché ci sono anche forti riferimenti a entrambi gli oggetti.
Penso che il test non sia corretto. Se si cambia 'while (map.size() == 2) {' a 'while (map.size()> 0) {', i due test terminano entrambi finché la mappa non è vuota, indipendentemente dal commento 'anObject = null' o no. A proposito, l'ho già provato. – donnior
Stampa 'anObject' e' anOtherObject' alla fine. Il compilatore vede che non li stai più utilizzando e puoi rimuoverli prima. –