JDK1.8 局部变量表

jvm参数

-verbose:gc
public class LocalVarTest {

    public static void main(String[] args) {
        byte[]placeholder = new byte[64*1024*1024];
        System.gc();
    }
}

执行结果

[GC (System.gc())  68872K->66336K(125952K), 0.0014157 secs]
[Full GC (System.gc())  66336K->66233K(125952K), 0.0056158 secs]

内存未释放,因为在执行System.gc()时,变量placeholder 还在作用域内,所以未释放

public class LocalVarTest {

    public static void main(String[] args) {
        {
            byte[] placeholder = new byte[64 * 1024 * 1024];
        }

        System.gc();
    }
}
[GC (System.gc())  68872K->66320K(125952K), 0.0012127 secs]
[Full GC (System.gc())  66320K->66233K(125952K), 0.0059661 secs]

内存仍未释放,其根本原因为:局部变量表中的Slot是否还存有源于placeholder数组对象的引用。代码虽然已经离开了作用域,但在此之后,没有任何局部变量表的读写操作,placeholder原本占用的Slot还没有别其他变量所复用,所以作为GC Roots一部分的局部变量表仍然保持着对他的关联。

public class LocalVarTest {

    public static void main(String[] args) {
        {
            byte[] placeholder = new byte[64 * 1024 * 1024];
        }
        int a = 0;
        System.gc();
    }
}
[GC (System.gc())  68872K->66384K(125952K), 0.0014311 secs]
[Full GC (System.gc())  66384K->697K(125952K), 0.0051174 secs]

内存已释放

猜你喜欢

转载自blog.csdn.net/ciqingloveless/article/details/82353882
今日推荐