首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当方法使用Java时,可以收集实例吗?

当方法使用Java时,可以收集实例吗?
EN

Stack Overflow用户
提问于 2015-07-04 11:05:29
回答 2查看 50关注 0票数 4

关于Java,我有一个简单的问题。一些例子:

代码语言:javascript
复制
Object instance = new Object();
longMethod(instance);

...

// First example
private void longMethod(Object arg) {
   Thread.sleep(1000 * 60 * 60)
   // this method works 1hr. Does it keep reference to Object and GC canot release it?
}

//Seconde example
private void longMethod(Object arg) {
  arg = null;
  Thread.sleep(1000 * 60 * 60)
  // we clear reference in method. Can GC relese Object now?
}

那么,在这两种情况下,“实例”的生命周期是什么?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-04 11:23:06

pass-by-value:是arg,将第二个方法中的局部变量arg设置为null并不意味着调用方方法中的局部变量也被设置为引用null。因此,调用方中的对象仍然有指向它的引用。

考虑在方法中创建一个新对象的情况:

代码语言:javascript
复制
private void longMethod(Object arg) {
   arg = new Object();  // Line 1
   Thread.sleep(1000 * 60 * 60);
   arg = null;  // now the object created in line 1 is eligible for GC

}

在这种情况下,使用arg = new Object();创建的对象(与调用方方法中创建的对象不同)有资格使用GC。

并考虑在调用方方法中存在这样的情况:

代码语言:javascript
复制
Object instance = new Object();  // Line 1
longMethod(instance);   
instance = null; // now the object created in line 1 is eligible for GC (see note below)

现在,先前在第1行中创建的对象也符合GC 的条件,前提是不引用在中创建的对象。

票数 2
EN

Stack Overflow用户

发布于 2015-07-04 11:07:28

在这两种情况下,Object instance都是调用longMethod的方法的局部变量,它保存对实例的引用,因此GC不能在调用longMethod的方法结束之前释放它。

注意,arg = null只将longMethod中的本地引用设置为null。它不会改变instance变量在调用longMethod的方法中的值。

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

https://stackoverflow.com/questions/31219865

复制
相关文章

相似问题

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