我的观点:1)静态变量本身不会被回收 2)静态变量所引用的对象是可以回收的。第一点大家应该没有疑问,下面我证明第2点:看下面的例子及注释。自己可以运行试一下, 注意加上-verbose:gc参数java -verbose:gc TestStaticGc// TestStaticGc.java public class TestStaticGc { // ia是一个静态变量,在这里它作为一个int数组的引用。 static int[] ia = new int[1024 * 1024];
public static void main(String[] args) { int i = 0; // 为了清楚,我用了6次循环,每次都调用System.gc(); // 在第3次循环时,我把ia的引用设为null。 // 如果ia指向的对象能被回收的话,应该有明显的内存减少现象。 do { if (3 == i++) { ia = null; System.out.println("release"); } System.gc(); } while (i<6); } }现在看结果: ---------- java ---------- // 前两次是每个应用初始化之后都要做的。 [GC 328K->162K(1984K), 0.0043279 secs] [Full GC 162K->162K(1984K), 0.1501831 secs] // 下面是调用System.gc()的结果 [Full GC 4267K->4258K(6084K), 0.0234695 secs] // i = 0 [Full GC 4268K->4258K(7676K), 0.0235161 secs] // i = 1 [Full GC 4258K->4257K(7676K), 0.0299952 secs] // i = 2 release // 静态变量设为null // 看,明显的内存变化。 [Full GC 4266K->161K(7676K), 0.0234256 secs] // i = 3 [Full GC 161K->161K(7676K), 0.0233586 secs] // i = 4 [Full GC 161K->161K(7108K), 0.0238793 secs] // i = 5结论: 我的观点正确。结果: 楼主给分吧
如果一个类的class文件被装载,那么它的静态成员变量便会被初始化,除非unloader这个类的class对象,他的静态成员变量是不会被gc的
static Vector pane = new Vector();然后
pane = null;如果没有其它引用的话,原来pane指向的对象实例就会被回收。据我所知没有办法测试。因为,只要别的地方也存在该Vector对象的引用,那么就不符合回收标准;如果都没引用了,你也无法判断该Vector对象是不是真的从内存里回收了。所以,就相信JVM的GC吧。
static 又不是在 heap上分配的
你不把对象的引用设为null,GC永远不会回收。
回收的一般是通过new产生在堆上的对象.
2)静态变量所引用的对象是可以回收的。第一点大家应该没有疑问,下面我证明第2点:看下面的例子及注释。自己可以运行试一下, 注意加上-verbose:gc参数java -verbose:gc TestStaticGc// TestStaticGc.java
public class TestStaticGc {
// ia是一个静态变量,在这里它作为一个int数组的引用。
static int[] ia = new int[1024 * 1024];
public static void main(String[] args) {
int i = 0;
// 为了清楚,我用了6次循环,每次都调用System.gc();
// 在第3次循环时,我把ia的引用设为null。
// 如果ia指向的对象能被回收的话,应该有明显的内存减少现象。
do {
if (3 == i++) {
ia = null;
System.out.println("release");
}
System.gc();
} while (i<6);
}
}现在看结果:
---------- java ----------
// 前两次是每个应用初始化之后都要做的。
[GC 328K->162K(1984K), 0.0043279 secs]
[Full GC 162K->162K(1984K), 0.1501831 secs]
// 下面是调用System.gc()的结果
[Full GC 4267K->4258K(6084K), 0.0234695 secs] // i = 0
[Full GC 4268K->4258K(7676K), 0.0235161 secs] // i = 1
[Full GC 4258K->4257K(7676K), 0.0299952 secs] // i = 2
release // 静态变量设为null
// 看,明显的内存变化。
[Full GC 4266K->161K(7676K), 0.0234256 secs] // i = 3
[Full GC 161K->161K(7676K), 0.0233586 secs] // i = 4
[Full GC 161K->161K(7108K), 0.0238793 secs] // i = 5结论:
我的观点正确。结果:
楼主给分吧
对象都是一样的,只要没有对它的引用,就可以被回收(但是不一定被回收).static只是说这个对象属于类实例变量,引用是一直存在,被引用的对象当然可以改变.
只要其他地方都没有引用它,就可以被回收.
况且stack里面有对象吗? (stack分配对象需要在编译时知道对象的大小)