我们知道内存可以通过调用系统的垃圾回收机制来回收内存。
那么回收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方法是可以很好地实现垃圾回收的,这是因为方法已经结束,自然可以回收。