static类/变量会不会被GC回收?

wjvonline 2006-04-16 05:02:10
调用System.gc(),没测试出来,大家来讨论下~
...全文
4513 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
做鸡真好吃 2006-05-10
  • 打赏
  • 举报
回复
??
netsummer123 2006-04-17
  • 打赏
  • 举报
回复
应该不会把
netsummer123 2006-04-17
  • 打赏
  • 举报
回复
好像GC只回收堆内存里的对象把
foxty 2006-04-17
  • 打赏
  • 举报
回复
纠正一些错误的说法。

static变量同样是再heap上分配空间的。也会北回收,当这个类不需要再用到时,虚拟机就会回收这个类再heap中分配的控件,同时他的static变量肯定也会被回收(这个static变量唯一被引用)。
treeroot 2006-04-17
  • 打赏
  • 举报
回复
stack里对象需要回收吗? 方法返回什么都没有了
况且stack里面有对象吗? (stack分配对象需要在编译时知道对象的大小)

treeroot 2006-04-17
  • 打赏
  • 举报
回复
对象的回收和是否static没有什么关系!
对象都是一样的,只要没有对它的引用,就可以被回收(但是不一定被回收).

static只是说这个对象属于类实例变量,引用是一直存在,被引用的对象当然可以改变.
只要其他地方都没有引用它,就可以被回收.

zorro09 2006-04-17
  • 打赏
  • 举报
回复
stack 里应该是不会被回收的, heap是会的。
UnAgain 2006-04-16
  • 打赏
  • 举报
回复 2
我的观点:

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

结论:
我的观点正确。

结果:
楼主给分吧
powerman_lyj 2006-04-16
  • 打赏
  • 举报
回复
上面有字写错了:

静态变量是依附于创建他的类的,只有引用他类,和创建他的类都没有被其他类引用时才会被垃圾处理器回收
powerman_lyj 2006-04-16
  • 打赏
  • 举报
回复
静态变量是依附于创建他的类的,只有应用他类,和创建他的类都没有被其他类应用时才会被垃圾处理器回收
xujianhua815926 2006-04-16
  • 打赏
  • 举报
回复
楼上的 pane 是对象的引用,分配在栈中.
回收的一般是通过new产生在堆上的对象.
Dan1980 2006-04-16
  • 打赏
  • 举报
回复
晕,对象都是在heap上的!
你不把对象的引用设为null,GC永远不会回收。
yes1983 2006-04-16
  • 打赏
  • 举报
回复
不会,gc只回收heap里的对象
kingofworl 2006-04-16
  • 打赏
  • 举报
回复
不会
睡在床板下_ 2006-04-16
  • 打赏
  • 举报
回复
收回 什么??
static 又不是在 heap上分配的
ld_thinking 2006-04-16
  • 打赏
  • 举报
回复
不存在收不收回。。。
UnAgain 2006-04-16
  • 打赏
  • 举报
回复
静态变量本身不会被回收,但是它所引用的对象应该是可以回收的。
wjvonline 2006-04-16
  • 打赏
  • 举报
回复
恩,楼上的诸位说的都是,我仔细想了想,应该不会被回收,他不是被分配在heap里,生命周期应该是在JVM结束时
UnAgain 2006-04-16
  • 打赏
  • 举报
回复
声明
static Vector pane = new Vector();

然后
pane = null;

如果没有其它引用的话,原来pane指向的对象实例就会被回收。据我所知没有办法测试。因为,只要别的地方也存在该Vector对象的引用,那么就不符合回收标准;如果都没引用了,你也无法判断该Vector对象是不是真的从内存里回收了。所以,就相信JVM的GC吧。
interpb 2006-04-16
  • 打赏
  • 举报
回复
全局变量始终会有一个Class 对象的句柄指向它

除非这个Class对象要被回收了

否则静态变量是不会被GC掉

加载更多回复(5)

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧