3 回答
TA贡献1936条经验 获得超6个赞
首先不要使用finalize
- 它已被弃用,有更好的方法来清理你自己,所以到处都是这样的帖子(ReferenceQueue
并且SoftReferences
是这样的帖子)。
然后不要使用内部缓存的对象作为WeakHashMap
(String
就是这样的) 中的键。
最后一点是,这与 无关WeakHashMap
,这是对象的基本活力。在您的第一个示例中,您明确地将引用设置为null
,因此它们会被 GC 清除,在您的第二个示例中您没有,并通过System.out.println(hashMap);
;保持对它的强引用;因此它不会被收集。
TA贡献1850条经验 获得超11个赞
在您的第一个示例中,您将hashMap
变量设置为null
. 这样就不再有对 HashMap 对象的引用,它可以像任何其他类型的对象一样被垃圾收集。HashMap
并且WeakHashMap
在这方面没有什么不同。
不同之处在于 a 中的键在WeakHashMap
没有外部引用时可能会被垃圾收集。在正常情况下HashMap
,这不会发生,因为映射本身包含对键的引用。
一旦收集到密钥,就WeakHashMap
可以清除整个相应的条目。这个答案更详细地介绍了它。
TA贡献1852条经验 获得超7个赞
我认为您误解了 GC 的工作原理。
一句话:类的实例在不再被引用时被垃圾回收。它与类型无关。
这就是为什么要注意变量的范围如此重要。如果您保留对不再需要的对象的引用,它将不会被收集并且您将浪费资源。
此外,您正在调用 System.gc()...您不能以编程方式调用 GC。它会按照自己的规则运行。充其量,您可以“建议”您希望 GC 运行的 JVM。
我建议你看看:https : //www.dynatrace.com/resources/ebooks/javabook/how-garbage-collection-works/
添加回答
举报