繁体   English   中英

HashMap垃圾中的项目是否为空后会被收集?

[英]Is an item in a HashMap garbage collected after being nulled?

在以下代码中,将对emp对象进行垃圾回收吗?

import java.util.HashMap;   
public class Test {

    public static void main(String args[]) {
        HashMap<Employee, EmployeeVal> aMap = new 
                       HashMap<Employee, EmployeeVal>();

        Employee emp = new Employee("Vinoth");
        EmployeeVal val = new EmployeeVal("Programmer");

        aMap.put(emp, val);

        emp = null;

        System.gc();
        System.out.println("Size of Map" + aMap.size());

    }
}

看起来应该是这样,但根据这篇文章不是这样的:

Java中的SoftReference和WeakReference有什么区别?

是否将emp设置为null与否无关紧要。 应用程序逻辑保持不变; 您要在地图上放置一个条目,请不要删除它,因此aMap.size()的唯一有效答案是1 (一)。

即使您假设您永远无法访问映射是正确的(事实并非如此,您也可以通过aMap.keySet().iterator().next()检索Employee实例, aMap.keySet().iterator().next()一个例子),例如如果创建一个封装另一个永不使用的对象的类,则该类不允许更改基于封装的计算结果,例如HashMap报告的大小。

关于此问题的一个简单视图是,您持有对HashMap的引用,而后者又持有对Employee实例的引用。

但是实际上,只要JVM确保程序的正确性即可将这些对象进行垃圾回收,例如确保最后的print语句产生Size of Map1的输出Size of Map1 ,这在技术上是可能的,而无需保留HashMap及其所有内存。引用的对象。 它只需要保留int size字段的值,或者只记住可预测的字符串结果即可。

但是尽管规范允许这样做,但不能保证。 垃圾收集是尽力而为的过程。 此类明显引用的对象的收集仅针对优化的代码发生,并且JVM通常不会对由单个main方法(在几毫秒内终止)组成的应用程序的代码进行优化。

最重要的是,无论JVM是否在后台回收内存,垃圾回收都不会导致HashMap虚假地更改其大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM