我们知道,Java虚拟机栈的局部变量表,最基本的存储单元是slot,相当于为各种变量预留了内存空间。在局部变量表里,32位以内的类型只占用一个slot,64位的类型(long和double)占用两个slot。而为了尽可能节省栈帧空间,局部变量表中的Slot是可以重用的。
public void gc(){
{
byte[] arr = new byte[1024 * 10 * 1024];
}
System.gc();
}
第一段代码触发了GC,内存没有回收。但是在第二段代码中,回收了内存,原因是方法体中的arr数组它的作用域在大括号内,当出了作用域之后,分配给arr对象的槽位被value替换了,失去了引用,所以回收了内存
public void gc(){
{
byte[] arr = new byte[1024 * 10 * 1024];
}
int value = 10;
System.gc();
}