我读过那个Java is passed by value。假设我们有这样的代码,并且HashMap somehashMap比foo的生命周期更长。因此,不允许对foo进行垃圾回收,即使它已经完成了它的工作,因为我们将foo放在Map中,然后忘记从其中删除。现在,根据我链接的帖子中答案的逻辑,我们实际上是在将foo的引用的副本传递给put()方法,对吧?在这种情况下,将foo放入HashMap中不应该阻止它被垃圾回收。你能告诉我这里发生了什么吗?我到底错过了什么?
public void someMethod(){
Foo foo = new Foo();
somehashMap.put(fooKey,foo);
}发布于 2012-07-31 21:26:38
垃圾收集不适用于引用,而适用于驻留在堆中的实际对象。当您将foo放入Map中时,您基本上是在帮助它“逃离”当前的作用域,并将其置于与somehashMap相同的作用域/生命周期中。
Java中的引用是在幕后透明地处理的。当您将foo引用放在映射中时,引用的副本实际上被传递给put方法调用,但是对于原始引用和复制的引用,底层对象(即new Foo() )是相同的。让我们看一下下面的代码片段:
public void doIt() {
Object f1 = new Object();
Object f2 = f1;
Object f3 = f2;
}在上面的代码片段中,有多少对象在doIt执行完成后被垃圾回收?它只是我们创建的单个new Object()。Rest都是简单的引用或别名,用于指向相同的对象。
发布于 2012-07-31 21:27:26
只要一个对象是可访问的,它就不能被垃圾回收。在您的例子中,Foo foo = someHashMap.get(fooKey);可以访问foo,所以只要foo在映射中并且映射本身是可访问的,就不能对其进行垃圾回收。
发布于 2012-07-31 21:28:18
我认为你并不清楚什么是引用。
'foo‘是对一个对象的引用,将其添加到hashmap实际上创建了对同一对象的第二个引用,这一点您是对的。
然而,这正是当'foo‘变量消失时对象不会被垃圾回收的原因。对象只有在没有引用时才会被垃圾回收--你从一个引用(foo)开始,然后创建第二个引用(在hashmap中),当你的函数结束时,第一个引用就消失了,但你仍然只剩下一个引用。
https://stackoverflow.com/questions/11741128
复制相似问题