ConcurrentWeakKeyHashMapがメモリ状態/ガベージコレクションにどのように応答するかを理解しようとしています。ConcurrentWeakKeyHashMap size()メソッド
maxNum == 6000のJUnitテストのコードでは、 アサーションステートメントが失敗しました。サイズは= 4123(またはそれに類するもの)でした。
私はJVM -Xmxを500mに設定しましたが、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();
私は実際にどのエントリが再生されるかを制御できないように見えます。 – portoalet
はい、あなたは(*別の参照をどこかに置くことによって)*回収*できないものだけを制御できます。 – Thilo
強いオブジェクト(ConcurrentHashMap)にキーを固定すると、私は6000を得ました。 Thiloありがとう。 – portoalet