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= 中创建的对象的引用]
我有一个关于 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= 中创建的对象的引用]