栈帧,for与whiletrue(yet)

1 当前栈帧(Current Stack Frame)

一个线程中的方法调用链可能会很长,很多方法都同时处于执行状态。对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是最有效的,称为当前栈帧(Current Stack Frame),与这个栈帧相关联的方法称为当前方法执行引擎运行的所有的字节码指令都只针对当前栈帧进行操作。

1线程——n方法

1方法——1栈帧


2 组成

2.1 局部变量表(Local Variable Table) 是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。

  1. public static void main(String[] args) {
  2. {
  3. byte[] placeholder = new byte[64 * 1024 * 1024];
  4. }
  5. int a = 0;
  6. System.gc();
  7. }

这个修改看起来很莫名其妙,但运行一下程序,却发现这次内存真的被正确回收了。

在如上代码中,placeholder 能否被回收的根本原因是:局部变量中的 Slot 是否还存在关于 placeholder 数组对象的引用。第一次修改中,代码虽然已经离开了 placeholder 的作用域,但在此之后,没有任何局部变量表的读写操作,placeholder 原本占用的 Slot 还没有被其他变量所复用,所以作为 GC Roots 一部分的局部变量表仍然保持着对它的关联。这种关联没有被及时打断,在绝大部分情况下影响都很轻微。但如果遇到一个方法,其后面的代码有一些耗时很长的操作,而前面又定义了占用了大量的内存、实际上已经不会再使用的变量,手动将其设置为 null 值(用来代替那句 int a=0,把变量对应的局部变量表 Slot 清空)

原文地址:https://www.cnblogs.com/silyvin/p/12155457.html