栈GC

我们知道内存可以通过调用系统的垃圾回收机制来回收内存。

那么回收java类中的局部变量表,效果是怎样的呢?

public class Test4 {

public static void add(){

byte [] b = new byte [6*1024*1024];

System.gc();
System.out.println("Hello World!");

}
public static void main(String [] args){
add();
}

}

在add方法里创建了一个byte类型的数组。

然后再方法里调用系统的gc,垃圾回收方法。并且输出Hello World字符串。

在主方法中调用这个方法。

cmd下执行查看结果:


可以看到:

在cmd命令下,执行verbose:gc方法,可以早控制台打印gc垃圾回收器的执行效果。

方法System.gc()执行后,垃圾回收器将6997k的内存回收至6735K,

几乎没有什么变化,所以这样写垃圾回收器并没有起到很好的回收垃圾的效果。

再来看下一个:

2.

public class Test3 {

public static void add(){

byte [] b = new byte [6*1024*1024];

int c=0;
System.gc();
System.out.println("Hello World!");

}
public static void main(String [] args){
add();
}
}

查看结果:

同样的,没有效果。

第三个例子:

3.

public class Test3 {

public static void add(){
{
byte [] b = new byte [6*1024*1024];

}

int c=0;
System.gc();
System.out.println("Hello World!");

}
public static void main(String [] args){
add();
}
}

查看结果:

gc作用很明显。

为什么呢?这段代码与之前的两段代码作比较:

可以看到,b变量被赋值的这一段代码被一个大括号括起来了。

这个大括号起的作用是什么呢?

这是因为大括号括起来的b的作用域小于变量c在方法体中的作用域。

因此变量c此时可以重用b的变量表。

在虚拟机规范中规定了:局部变量表中的solt槽在局部方法中不同的作用域范围是可以重用的。

这刚好与实例2的对比可以体现出来。


------------------------------

局部变量表中的重用变量空间必须发生在不同作用域的变量之间。

而且不同作用域的变量表的空间重用是按照顺序来的。(按照变量的声明和赋值顺序来重用)

那么如果在主方法中调用gc方法,对于不同作用域的变量,gc效果是怎么样的?大家可以尝试下,提前公布下我的结果是,在主方法中调用gc方法是可以很好地实现垃圾回收的,这是因为方法已经结束,自然可以回收。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值