堆栈帧占用的大小

Bat*_*tty 5 java memory stack-frame

Java 堆栈为每个方法调用创建新框架,但是此框架是否占用堆栈上的内存?

澄清我的问题:

public void oneWay()
{
  System.out.println("start");
  get1();
}

private void get1()
{
  System.out.println("get1");
  get2();
}

private void get2()
{
  System.out.println("get2");
}
Run Code Online (Sandbox Code Playgroud)

此输出与以下内容相同:

public void anotherWay()
{
  System.out.println("start");
  System.out.println("get1");
  System.out.println("get2");
}
Run Code Online (Sandbox Code Playgroud)

但是第二个片段在堆栈上占用更多内存还是相等?简而言之,堆栈帧是否占用内存?

编辑:堆栈帧需要多少内存?Sun(现在是 Oracle)是否有任何规范?

Kay*_*man 5

是的,自然。这就是为什么如果嵌套太深就会出现堆栈溢出的原因。-Xss如果您发现线程需要更大(或更小)的堆栈,则可以使用命令行开关修改堆栈大小。

规范似乎为实现提供了很大的自由度,因此总而言之,您不能真正依赖堆栈帧大小。

  • 只是想补充一点,这一切并不意味着您应该削弱您的设计以使用更少的模块和更多的代码。由于模块化设计,您不太可能耗尽内存 (2认同)

Bat*_*tty 4

正如《Java 虚拟机内部》中所述,

栈帧由三部分组成:局部变量、操作数栈和帧数据。局部变量和操作数堆栈的大小以字为单位,取决于每个方法的需要。这些大小是在编译时确定的,并包含在每个方法的类文件数据中。帧数据的大小取决于实现。

当Java虚拟机调用Java方法时,它会检查类数据以确定该方法所需的局部变量和操作数堆栈中的字数。它为该方法创建一个适当大小的堆栈帧并将其推送到 Java 堆栈上。