以下为书摘。
|
1
2
3
4
5
6
|
public static void main(String[] args){ { byte[] placeholder = new byte[64*1024*1024]; } system.gc();} |
以上代码调用后,垃圾回收并没有回收多少。
|
1
2
3
4
5
6
7
|
public static void main(String[] args){ { byte[] placeholder = new byte[64*1024*1024]; } int a = 0; system.gc();} |
以上代码调用后,回收了64M内存。
第1种,局部变量表的slot还保留着关于placeholder的数组对象引用,gc没办法回收。
第2种,重新分配一个int a类型,由于局部变量表slot的复用特性,Placeholder的slot引用被打断,内存成功释放。
很多代码都会手动将一个对象赋值为null,就是这个道理了
本文通过两个实例探讨了Java中局部变量表与内存回收的关系。在第一个例子中,创建了一个大的字节数组并立即调用了GC,但并未释放内存;而在第二个例子中,通过在原来的局部变量位置上定义新的变量,成功触发了内存回收。文章解释了局部变量表的Slot复用机制是如何影响内存回收过程的。
829

被折叠的 条评论
为什么被折叠?



