ip6*_*696 3 java garbage-collection
在通话时有哪些对象可用于垃圾收集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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果object == null它变成了垃圾?
我认为a1,a2并且mas在调用时可用于垃圾收集,System.gc()因为它处于null状态.或者我错了?
首先,您的程序变量永远不会"可用于垃圾回收".GC只收集对象,程序变量是对象的引用,而不是对象本身.(引用Java变量的常用术语混淆了这一点.)
其次,没有被引用的对象a1,a2或mas将要GC'ed.尽管事实已经a1并且a2已经确定了null.这是因为对这些对象的引用仍然通过两种抵达list或mas.为什么引用的对象即使在调用之后a2仍然可以访问?因为你不能改变的变量的值在由变量传递给方法.您在该方法中所做的只是更改形式参数(也称为),它是与本地变量的单独变量.Java严格按值传递.然而,当涉及到对象时,总是传递的是一个masclear()masmain()clear()masmain()参考.
通常,规则是只有当对象无法直接或间接从任何程序变量访问时,对象才会被GC.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |