【发布时间】:2018-10-11 12:23:05
【问题描述】:
据我了解,HashMap 不应该被垃圾回收,WeakHashMap 应该被垃圾回收,但是当我运行这段代码时,hashmap 和weakhashmap 都被垃圾回收了。
import java.util.HashMap;
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
HashMap<String,Temp> hashMap= new HashMap<>();
hashMap.put("a", new Temp("hashmap"));
WeakHashMap<String,Temp> weakHashMap= new WeakHashMap<>();
weakHashMap.put("a", new Temp("identity hashmap"));
hashMap= null;
weakHashMap= null;
System.gc();
try {
Thread.sleep(5000);
}catch(InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
System.out.println(hashMap);
System.out.println(weakHashMap);
}
}
class Temp {
String name;
Temp(String name) {
this.name= name;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(name+":: Finalize Method Executed");
}
@Override
public String toString() {
return this.name;
}
}
输出:
identity hashmap:: Finalize Method Executed
hashmap:: Finalize Method Executed
null
null
仅使用 HashMap 时,GC 不会对其进行垃圾回收。
import java.util.HashMap;
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
HashMap<String,Temp> hashMap= new HashMap<>();
hashMap.put("a", new Temp("hashmap"));
System.gc();
try {
Thread.sleep(5000);
}catch(InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
System.out.println(hashMap);
}
}
class Temp {
String name;
Temp(String name) {
this.name= name;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(name+":: Finalize Method Executed");
}
@Override
public String toString() {
return this.name;
}
}
输出:
{a=hashmap}
【问题讨论】:
-
这里有很多问题,使用已弃用的
finalize(出于某种原因!)并使用String作为WeakHashMap中的键 - 这又是一个大惊喜跨度> -
我真的不明白你想在这里证明什么,在你的第二个例子中,你通过
System.out.println(hashMap);强烈引用了非空hashMap- 所以垃圾收集器绝对不能收回它;不像你的第一个例子 -
@Eugene 好的,感谢您的指点,但在 WeakHashMap 中使用字符串不能负责 HashMap 被垃圾收集......对吗?
-
因为您明确地将其设置为 null
-
添加了捕获这些 cmets 的答案
标签: java collections hashmap garbage-collection weakhashmap