java - 函数的最大堆栈空间

标签 java

我正在尝试确定我的 fork/join 实现何时会堆栈溢出。

我知道编译器决定了一个函数在编译时需要的最大堆栈空间。所以这些信息应该在我的 java 代码的 .class 文件中可用。但是,我似乎无法弄清楚如何获得这个值(value)。

我能否在运行时将其打印出来,或者任何人都可以指出我可以在类文件中找到它的位置吗? gedit 中全是乱码,所以我似乎找不到它。

最佳答案

没有简单的方法可以判断方法调用是否会导致堆栈溢出。

虽然您可以确定方法在堆栈上需要的数量,但这并不能告诉您实际需要的字节数。

Java 字节码与实际堆栈的抽象一起工作,其中堆栈被视为由抽象“插槽”组成。 this-reference、方法参数和局部变量都占用堆栈上的一个或两个槽(long 和 double 需要两个槽,其他都算作一个槽)。这就是您可以从类文件中获得的信息。

仍然缺少的是槽实际上是如何转换为堆栈内存的,以及 JIT 实际上从字节代码中创建了什么。 JIT 还不如决定在执行优化(例如代码不变移动)时添加临时变量。

此外,当您调用本地方法时,无法得知调用将占用多少堆栈内存。

你看,这在很大程度上取决于当前的 JRE、VM 和平台。再加上缺乏一个简单的内置方法来实际确定实际堆栈有多大,这使得确定需要多少堆栈和可用多少堆栈变得不切实际。

关于java - 函数的最大堆栈空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24308906/

相关文章:

java - 每次迭代为任务安排一个新日期 - Java Spring

java - 是否可以在多台电脑上运行一个jvm?

java - 从组件更改 JLabel ICON

java - 如何使用 lettuce java 库持续监听 redis 流

java - @ControllerAdvice 仅用于集中/全局异常处理或我们可以用它做的任何其他事情?

java - 使用 ant 引用 jar(不是/libs)的外部文件夹

java - Java 中的 VTD-XML - 在 XMLModifier.insertAfterElement 之后查找索引

Java多人服务器阻塞io

java - 具有 HAR 文件输出的 MapReduce 作业

java - 简单的 JUnit 测试失败