java 回收static_java static GC 回收问题 | 学步园

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

/usr/local/resin/bin/httpd.sh start -Xms1024m -Xmx4048m -Xss1000k -Djava.awt.headless=true -XX:PermSize=64M -XX:MaxPermSize=256M -XX:ErrorFile=/data/mqq_data/log/jvm_error.log -XX:NewSize=256m -XX:MaxNewSize=256m  -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值