【问题标题】:Is there a upper limit on stack frame size堆栈帧大小是否有上限
【发布时间】:2013-11-04 02:53:17
【问题描述】:

我们有一个堆内存不足的错误,但是(只是出于好奇而问)单个堆栈的大小是否有等效限制?如果不是,那么如果堆栈帧(如数千个局部变量等)需要过多的内存,那么如何防止这种溢出?

【问题讨论】:

    标签: java jvm out-of-memory heap-memory stack-memory


    【解决方案1】:

    每个线程都有自己的堆栈空间分配。您可以使用 Java 命令行上的 -Xss 选项设置此分配的大小;默认值在不同平台上有所不同,但始终是“每个线程”的数量。

    限制是每个线程的内存量,而不是堆栈上的条目数。

    【讨论】:

    • 数组存储在堆上,而不是栈上。
    • 嗯,是的,你完全正确。我不知道我在想什么。我将删除最后一句话。
    【解决方案2】:

    如果线程请求的堆栈空间超出其可用空间,则会收到 StackOverflowError。

    http://docs.oracle.com/javase/7/docs/api/java/lang/StackOverflowError.html

    单个堆栈帧的大小在编译时确定,并与方法的代码一起存储在类文件中。实际上有两个字段:局部变量数组的大小和操作数堆栈的深度。两者都限制为 2^16-1。 http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546

    【讨论】:

    • 我猜当number of stack frames 更多时会发生堆栈溢出。我说的是 individual stack 占用大量空间
    • 当堆栈上的剩余空间小于所需空间时,会发生堆栈溢出;并非所有堆栈帧的大小都相同。类文件规范对局部变量的数量有限制;如果你超过这个限制,那将是一个编译时错误。堆栈帧的大小由编译器计算。
    【解决方案3】:

    我认为,分配给运行时堆栈的空间是为单个执行线程上的所有堆栈帧组合的。

    大多数操作系统的默认大小不同。看看这些文档。如果需要,您可以使用-Xss JVM 参数增加大小。

    http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 2023-04-10
      • 2011-04-14
      • 2014-02-25
      • 2013-06-30
      • 2011-01-10
      • 2021-03-15
      • 1970-01-01
      • 2017-12-05
      相关资源
      最近更新 更多