gpt4 book ai didi

java - ConcurrentWeakKeyHashMap size() 方法

转载 作者:行者123 更新时间:2023-12-02 00:38:34 25 4
gpt4 key购买 nike

试图弄清楚如何ConcurrentWeakKeyHashMap响应内存状况/垃圾收集。

在我的 JUnit 测试中使用以下代码, maxNum == 6000,断言语句失败,大小== 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);

编辑

通过将弱键固定在强对象中,我总是得到 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();

最佳答案

当不再有任何对对象的“强”引用时,弱引用将被回收。

这是由于垃圾收集而发生的,而垃圾收集又在后台(或当内存不足时)发生得相当不可预测。特别是,即使仍然有足够的可用内存,这种情况也可能发生(特别是对于“早逝”的对象,系统会尝试尽早收集这些对象)。

我也不认为 ConcurrentWeakHashMap#size 始终完全准确。它有一个方法purgeStaleEntries,您可能应该调用该方法以获得更准确的结果。

关于java - ConcurrentWeakKeyHashMap size() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7036446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com