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