[英]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());
}
}
看起来应该是这样,但根据这篇文章不是这样的:
是否将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.