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]

内存已释放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值