Java ConcurrentWeakKeyHashMap size()方法

Java ConcurrentWeakKeyHashMap size()方法,java,concurrency,weak-references,Java,Concurrency,Weak References,试图弄清楚如何响应内存条件/垃圾收集 在我的JUnit测试中,maxNum==6000,使用下面的代码, assert语句失败,大小==4123(或类似值) 我将我的JVM-Xmx设置为500m,希望得到6000,但没有运气 假设大小因垃圾收集而改变,那么在什么情况下会回收弱密钥?i、 e.“内存不足,其他东西不足”情况? int maxNum = 6000; int initalCapacity = 2*maxNum; ConcurrentMap<String,S

试图弄清楚如何响应内存条件/垃圾收集

在我的JUnit测试中,maxNum==6000,使用下面的代码, assert语句失败,大小==4123(或类似值)

我将我的JVM-Xmx设置为500m,希望得到6000,但没有运气

假设大小因垃圾收集而改变,那么在什么情况下会回收弱密钥?i、 e.“内存不足,其他东西不足”情况?

    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);
int maxNum=6000;
int initalCapacity=2*maxNum;
ConcurrentMap ConcurrentMap=新的ConcurrentWeakKeyHashMap(初始容量);
整数计数=0;

对于(inti=0;i而言,当不再存在对对象的任何“强”引用时,将回收弱引用

这是由于垃圾收集造成的,而垃圾收集又在后台(或内存不足时)不可预测地发生。尤其是在内存仍然充足的情况下(特别是对于“早死”的对象,系统会尝试提前收集)


我也不会假设ConcurrentWeakHashMap的大小始终是完全准确的。它有一个方法
PurgestalEntries
,您可能应该调用该方法以获得更准确的结果。

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

这是由于垃圾收集造成的,而垃圾收集又在后台(或内存不足时)不可预测地发生。尤其是在内存仍然充足的情况下(特别是对于“早死”的对象,系统会尝试提前收集)


我也不会假设ConcurrentWeakHashMap#大小一直都是完全准确的。它有一个方法
PurgestalEntries
,您可能应该调用该方法以获得更准确的结果。

好的,所以看起来我真的无法控制哪个条目被回收是的,您只能控制哪些条目没有被回收(通过将另一个引用保留在某处)。好的,当我将密钥固定在一个强对象(ConcurrentHashMap)中时,我得到了6000。谢谢Thilo。好的,所以看起来我无法真正控制哪个条目被回收是的,你只能控制哪些条目没有被回收(通过将另一个引用保留在某处)。好的,当我将密钥固定在一个强对象中时,我得到了6000(ConcurrentHashMap)。谢谢你。
    // 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();