Метод ConcurrentWeakKeyHashMap size () - PullRequest
       15

Метод ConcurrentWeakKeyHashMap size ()

0 голосов
/ 12 августа 2011

Попытка понять, как 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();

1 Ответ

3 голосов
/ 12 августа 2011

Слабая ссылка восстанавливается, когда больше нет «сильной» ссылки на объект.

Это происходит из-за сборки мусора, что, в свою очередь, происходит довольно непредсказуемо в фоновом режиме (или когда у вас заканчивается память). В частности, это может произойти даже в том случае, когда все еще имеется много доступной памяти (особенно для объектов, которые «умерли молодыми», система пытается собрать их рано).

Я бы также не предположил, что размер ConcurrentWeakHashMap # всегда абсолютно точен. У него есть метод purgeStaleEntries, который вам, вероятно, следует вызвать, чтобы получить более точную информацию.

...