【问题标题】:Maximum stackspace for a function函数的最大堆栈空间
【发布时间】:2014-08-10 03:03:48
【问题描述】:

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

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

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

【问题讨论】:

标签: java


【解决方案1】:

JBE 是一个不错的独立工具,可让您浏览(和编辑)类文件。它显示的一个信息是某种方法的最大堆栈深度。如果 JBE 可以访问此信息,那么如果您打算使用字节码解析库,则可能会这样做。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 我应该同意你的看法。我已经尝试过 JBE 工具,但它没有给我确切的数字。我想我会以更一般的方式来制定我的答案。感谢您的信息。也许可以提供更详细信息的链接?我想读一读! :)
    • @ChristopheDeTroyer 肮脏的细节最终都在docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html Java 虚拟机规范中描述。特别令人感兴趣的可能是第 4 章(类文件格式,尤其是 4.7.3)和字节码指令集(第 6 章)。网上可能有第三方关于特定主题的更容易(提炼)的文章来回答特定问题。
    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 2012-02-22
    • 2016-04-06
    • 2019-05-04
    • 1970-01-01
    • 2014-04-14
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多