关于Java,我有一个简单的问题。一些例子:
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?
}那么,在这两种情况下,“实例”的生命周期是什么?谢谢。
发布于 2015-07-04 11:23:06
pass-by-value:是arg,将第二个方法中的局部变量arg设置为null并不意味着调用方方法中的局部变量也被设置为引用null。因此,调用方中的对象仍然有指向它的引用。
考虑在方法中创建一个新对象的情况:
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。
并考虑在调用方方法中存在这样的情况:
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 的条件,前提是不引用在中创建的对象。
发布于 2015-07-04 11:07:28
在这两种情况下,Object instance都是调用longMethod的方法的局部变量,它保存对实例的引用,因此GC不能在调用longMethod的方法结束之前释放它。
注意,arg = null只将longMethod中的本地引用设置为null。它不会改变instance变量在调用longMethod的方法中的值。
https://stackoverflow.com/questions/31219865
复制相似问题