java - HashMap 与 WeakHashMap 一起被垃圾收集?

标签 java collections hashmap garbage-collection weakhashmap

据我了解,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 - 它已被弃用,有更好的方法来清理你自己并且 SO 充满了这样的帖子(ReferenceQueueSoftReferences 就是其中之一)。

然后不要使用内部缓存的对象作为 WeakHashMap 中的键(String 就是这样)。

最后一点是,这与WeakHashMap无关,这是Objects的基本活力。在您的第一个示例中,您显式将引用设置为 null,因此它们会被 GC 清除,而在您的第二个示例中则不会,并通过System.out.println(hashMap);;因此它不会被收集。

关于java - HashMap 与 WeakHashMap 一起被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52760002/

相关文章:

java - 在elastic或mongodb中存储128位数字

java - 从 spring Controller 下载文件

java - 如何在不遍历 Java 的情况下转换完整列表

javascript - 列表 : {[id]:array1} and list: {. ..state.list、[id] :array1} in ReactJs? 之间有什么区别

java - 通过Hashmap迭代ArrayList以找到未使用的元素

java - 无法解决对 URLUtil 的依赖关系,要求冲突

java - 动态加载 Java 枚举类和枚举常量

java - 如何避免以下代码中的Java.util.IllegalStateException?

java - 如何在 java 中以相同的顺序打乱两个数组

java - 通过两种单独的方法获取数据