我正在尝试确定我的 fork/join 实现何时会堆栈溢出。
我知道编译器决定了一个函数在编译时需要的最大堆栈空间。所以这些信息应该在我的 java 代码的 .class 文件中可用。但是,我似乎无法弄清楚如何获得这个值(value)。
我能否在运行时将其打印出来,或者任何人都可以指出我可以在类文件中找到它的位置吗? gedit 中全是乱码,所以我似乎找不到它。
最佳答案
没有简单的方法可以判断方法调用是否会导致堆栈溢出。
虽然您可以确定方法在堆栈上需要的槽数量,但这并不能告诉您实际需要的字节数。
Java 字节码与实际堆栈的抽象一起工作,其中堆栈被视为由抽象“插槽”组成。 this-reference、方法参数和局部变量都占用堆栈上的一个或两个槽(long 和 double 需要两个槽,其他都算作一个槽)。这就是您可以从类文件中获得的信息。
仍然缺少的是槽实际上是如何转换为堆栈内存的,以及 JIT 实际上从字节代码中创建了什么。 JIT 还不如决定在执行优化(例如代码不变移动)时添加临时变量。
此外,当您调用本地方法时,无法得知调用将占用多少堆栈内存。
你看,这在很大程度上取决于当前的 JRE、VM 和平台。再加上缺乏一个简单的内置方法来实际确定实际堆栈有多大,这使得确定需要多少堆栈和可用多少堆栈变得不切实际。
关于java - 函数的最大堆栈空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24308906/