现在的位置: 首页 > 综合 > 正文

java static GC 回收问题

2017年12月06日 ⁄ 综合 ⁄ 共 1501字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.