欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK1.8 局部变量表

程序员文章站 2024-02-08 14:29:28
...

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]

内存已释放