局部数组区间在栈上根本不存在,所谓“物理重合”只是栈帧复用的副作用,不可控且无压缩收益;真正有效的栈帧压缩路径是减少参数个数、避免大对象引用滞留、消除深层嵌套调用。

局部数组区间的物理重合不是可主动利用的优化手段,而是一种底层实现细节,不能用于“极限压缩栈帧”。试图依赖它做栈空间压缩,既不可控,也无实际收益,反而容易引发理解偏差和误操作。
所谓“物理重合”其实是栈帧复用的副作用
在 HotSpot 等 JVM 实现中,相邻栈帧之间存在内存布局上的物理交叠:被调用方法的局部变量表起始地址,常被设为调用方法操作数栈的当前栈顶位置。这种设计只为参数传递免拷贝——仅覆盖前几个 slot(对应形参),其余局部变量仍严格分配在独立槽位中,不共享、不复用。
数组本身(如 int[] arr = new int[1024])是堆对象,其引用存于局部变量表,但数组元素完全在堆上;栈里只占一个引用槽(4 或 8 字节)。所以“局部数组区间”根本不在栈上连续分布,更谈不上“区间重合”。
真正能压缩栈帧的可控路径只有三个
- 减少参数个数并聚合:把 6 个松散参数(x, y, w, h, scale, flip)封装为 record PointRect,降低 max_locals 值,实测可缩减栈帧体积 15–20 字节
- 避免大对象引用滞留:解析大包文时不用 String 或 byte[] 持有整包,改用 InputStream + JsonReader,让局部变量表不长期持有超大引用
- 消除深层嵌套调用:将递归解析改为循环+显式状态栈(如用 ArrayDeque 存 offset/depth),把调用栈深度从 O(n) 降为 O(1)
为什么别碰“数组区间重合”这类说法
Java 局部变量表是编译期定长结构,数组声明(int[] a;)只占 1 个 slot;new int[1000] 分配在堆,与栈帧大小无关。所谓“数组区间”在栈上根本不存在。混淆这个概念,容易让人误以为把多个数组声明写在一起就能省空间,其实字节码里它们只是连续编号的 slot,总长度由 max_locals 决定,不会因排列方式改变。
压栈空间的关键,从来不是“怎么挤”,而是“别往栈上放不该放的东西”——数据放堆、状态放对象、流程去递归。

















