WeakHashMap的使用不慎導致內存溢出分析

WeakHashMap的使用不慎導致內存溢出分析,第1張

WeakHashMap的使用不慎導致內存溢出分析,第2張

目前,社區中有幾個應用程序使用類似於Locker的代碼,這些代碼基本上是從消息系統引擎中提取的。不同的是,消息中使用的Locker中的id類型是long,而id在作爲key放入Map時會被JVM自動轉換爲Long,從而避免WeakHashMap中的key被value引用。但是,如果使用String作爲id,JVM無法根據鍵是否仍然被引用來清除弱哈希映射中的條目,因爲映射中的值引用了自己的鍵。通過下麪的測試代碼可以清楚地觀察到結果。
public class Locker {
private static weak hashmap Locker map = new weak hashmap();
私有最終字符串id;
private Locker(String id){
this . id = id;
}
public synchronized static Locker acquire(String id){
Locker Locker = Locker map . get(key);
if(Locker = = null){
Locker = new Locker(id);
lockerMap.put(id,locker);//問題代碼,導致entry . key = = entry . value . id
/locker map . put(新字符串(id),locker);//這是保証WeakHashMap中的鍵不被value
}
return locker直接或間接引用的脩改方式;
}
public String getId(){
return this . id;
}
public static int getSize(){
return locker map . size();
}
}
public class locker test extends test case {
public void test locker(){
for(int I = 0;i < 10000000i ){
locker . acquire(" ABC" I);
if(I % 10000 = = 0){
system . GC();
system . out . println(locker . getsize());//輸出垃圾廻收映射的大小
}
}
}
}

位律師廻複

生活常識_百科知識_各類知識大全»WeakHashMap的使用不慎導致內存溢出分析

0條評論

    發表評論

    提供最優質的資源集郃

    立即查看了解詳情