调用System.gc()
时,哪些对象可用于垃圾回收,为什么?
public class GCTest {
static class A {
private String myName;
public A(String myName) {
this.myName = myName;
}
}
public static void main(String[] args) {
A a1 = new A("a1");
A a2 = new A("a2");
ArrayList list = new ArrayList();
list.add(a1);
A[] mas = new A[2];
mas[0] = a2;
a2 = a1;
clear(mas);
a1 = null;
a2 = null;
System.gc();
// some code
...
}
private static void clear(A[] mas) {
mas = null;
}
}
如果
object == null
变成垃圾还是没有?我认为
a1
,a2
和mas
在调用System.gc()
时可用于垃圾回收,因为它声明为null。还是我错了? 最佳答案
首先,您的程序变量永远不会“可用于垃圾回收”。 GC仅收集对象,并且程序变量是对对象的引用,而不是对象本身。 (在引用Java变量时常用的术语使这一点感到困惑。)
其次,a1
,a2
或mas
引用的所有对象都不会进行GC处理。尽管事实上a1
和a2
已设置为null
。这是因为通过list
或mas
仍然可以访问这些对象。为什么即使调用a2
后,mas
引用的对象仍然可以通过clear()
到达?因为您不能通过将变量传递给mas
方法来更改main()
中的clear()
变量的值。您在该方法中所做的所有事情都是在更改形式参数(也称为mas
),它是与main()
中的局部变量分开的变量。 Java严格按值传递。但是,当涉及对象时,始终传递的是引用。
通常,规则是,仅当对象无法从任何程序变量直接或间接访问对象时,才对对象进行GC处理。