JVM规范声明,
因为Java虚拟机堆栈永远不会被直接操作 除了推送和弹出帧之外,帧可以是堆分配的。该 不需要Java内存堆栈的内存 连续的。 此规范允许Java虚拟机堆栈 固定大小或根据需要动态扩展和收缩 计算。如果Java虚拟机堆栈具有固定大小, 可以选择每个Java虚拟机堆栈的大小 创建该堆栈时独立。
因为Java虚拟机堆栈永远不会被直接操作 除了推送和弹出帧之外,帧可以是堆分配的。该 不需要Java内存堆栈的内存 连续的。
此规范允许Java虚拟机堆栈 固定大小或根据需要动态扩展和收缩 计算。如果Java虚拟机堆栈具有固定大小, 可以选择每个Java虚拟机堆栈的大小 创建该堆栈时独立。
我认为你正在使用的jvm支持动态扩展堆栈。当调用链大于默认的初始堆栈大小时,堆栈帧将从堆中分配。这将导致执行速度变慢。
并且您使用参数指定堆栈大小,堆栈可能适用于固定大小模式。在这种情况下,所有空间都将事先分配,不需要新的分配。此外,当您给出低堆栈大小时,它不会展开并抛出StackOverflow,这也表明它正在处理固定大小模式。
由于您没有提到您正在使用的JVM实现,这只是基于JVM规范和您的用例信息的假设。
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.2