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]
内存已释放
上一篇: 局部变量表Slot复用