Попытка понять, как ConcurrentWeakKeyHashMap реагирует на состояние памяти / сборку мусора.
С кодом ниже в моем тесте JUnit с maxNum == 6000,
оператор assert не выполнен, с размером == 4123 (или чем-то похожим).
Я установил JVM -Xmx на 500 м, в надежде получить 6000, но не повезло.
При условии, что размер изменяется из-за сбора мусора, при каких условиях слабый ключ восстанавливается? то есть условие "недостаточно памяти, мало что-то еще"?
int maxNum = 6000;
int initalCapacity = 2*maxNum;
ConcurrentMap<String,String> concurrentMap = new ConcurrentWeakKeyHashMap<String,String>(initalCapacity);
int count = 0;
for( int i=0; i<maxNum; i++) {
String key = "k" + i;
String value = "v" + i;
concurrentMap.put(key, value);
count = i;
//System.out.println(concurrentMap.size());
}
int size = concurrentMap.size();
assertEquals(size, maxNum);
System.gc();
size = concurrentMap.size();
assertEquals(size, maxNum);
EDIT
Закрепляя слабый ключ в сильном объекте, я всегда получаю 6000 / maxNumber.
т.е.
// our strong object
List<String> strongList = new ArrayList();
for( int i=0; i<maxNum; i++) {
String key = "k" + i;
String value = "v" + i;
concurrentMap.put(key, value);
// key is now pinned in strong object
strongList.add(key);
}
// size will now equal to maxNum, as nothing gets reclaimed
int size = concurrentMap.size();