Java GC 可以收集实例,同时它被方法使用

Can Java GC collect instance, while it is used by method

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

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?
}

那么在这两种情况下 "instance" 的生命周期是多少?谢谢

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

请注意,arg = null 仅将 longMethod 内的本地引用设置为 null。它不会更改调用 longMethod.

的方法中 instance 变量的值

Java是pass-by-value:方法二设置局部变量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 假设没有对在 longMethod.[=15= 中创建的对象的引用]