首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Java内存泄漏的基础知识

关于Java内存泄漏的基础知识
EN

Stack Overflow用户
提问于 2012-07-31 21:23:14
回答 9查看 6.3K关注 0票数 3

我读过那个Java is passed by value。假设我们有这样的代码,并且HashMap somehashMapfoo的生命周期更长。因此,不允许对foo进行垃圾回收,即使它已经完成了它的工作,因为我们将foo放在Map中,然后忘记从其中删除。现在,根据我链接的帖子中答案的逻辑,我们实际上是在将foo的引用的副本传递给put()方法,对吧?在这种情况下,将foo放入HashMap中不应该阻止它被垃圾回收。你能告诉我这里发生了什么吗?我到底错过了什么?

代码语言:javascript
复制
 public void someMethod(){
     Foo foo  = new Foo();
     somehashMap.put(fooKey,foo); 
  }
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-07-31 21:26:38

垃圾收集不适用于引用,而适用于驻留在堆中的实际对象。当您将foo放入Map中时,您基本上是在帮助它“逃离”当前的作用域,并将其置于与somehashMap相同的作用域/生命周期中。

Java中的引用是在幕后透明地处理的。当您将foo引用放在映射中时,引用的副本实际上被传递给put方法调用,但是对于原始引用和复制的引用,底层对象(即new Foo() )是相同的。让我们看一下下面的代码片段:

代码语言:javascript
复制
public void doIt() {
  Object f1 = new Object();
  Object f2 = f1;
  Object f3 = f2;
}

在上面的代码片段中,有多少对象在doIt执行完成后被垃圾回收?它只是我们创建的单个new Object()。Rest都是简单的引用或别名,用于指向相同的对象。

票数 11
EN

Stack Overflow用户

发布于 2012-07-31 21:27:26

只要一个对象是可访问的,它就不能被垃圾回收。在您的例子中,Foo foo = someHashMap.get(fooKey);可以访问foo,所以只要foo在映射中并且映射本身是可访问的,就不能对其进行垃圾回收。

票数 7
EN

Stack Overflow用户

发布于 2012-07-31 21:28:18

我认为你并不清楚什么是引用。

'foo‘是对一个对象的引用,将其添加到hashmap实际上创建了对同一对象的第二个引用,这一点您是对的。

然而,这正是当'foo‘变量消失时对象不会被垃圾回收的原因。对象只有在没有引用时才会被垃圾回收--你从一个引用(foo)开始,然后创建第二个引用(在hashmap中),当你的函数结束时,第一个引用就消失了,但你仍然只剩下一个引用。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11741128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档