我正在尝试确定我的分支/合并实现何时会出现堆栈溢出。
我知道编译器在编译时确定函数所需的最大堆栈空间。因此,这些信息应该在我的Java代码的.class文件中可用。但是,我似乎无法找到如何获取这个值。
我能否在运行时打印它,或者有人可以指向我在类文件中可能找到它的地方吗?在gedit中,所有内容都是无意义的,因此我无法找到它。
我正在尝试确定我的分支/合并实现何时会出现堆栈溢出。
我知道编译器在编译时确定函数所需的最大堆栈空间。因此,这些信息应该在我的Java代码的.class文件中可用。但是,我似乎无法找到如何获取这个值。
我能否在运行时打印它,或者有人可以指向我在类文件中可能找到它的地方吗?在gedit中,所有内容都是无意义的,因此我无法找到它。
没有简单的方法可以判断方法调用是否会导致堆栈溢出。
虽然您可以确定方法在堆栈上需要的槽位数量,但这并不能告诉您实际所需的字节数。
Java字节码使用实际堆栈的抽象表示,其中堆栈被视为由抽象的“槽位”组成。this引用、方法参数和局部变量都占用堆栈上的一个或两个槽位(long和double需要两个槽位,其他所有内容均计为一个槽位)。这是您可以从类文件中获取的信息。
仍然缺少的是如何将槽位实际转换为堆栈内存,以及JIT实际从字节码创建的内容。JIT也可能决定在执行优化(例如代码不变移动)时添加临时变量。
另外,当您调用本机方法时,无法确定调用将使用多少堆栈内存。
您看,很多情况取决于当前的JRE、VM和平台。再加上缺乏一个简单的内置方法来确定实际堆栈的大小,这使得确定需要多少堆栈和可用多少堆栈变得不切实际。
.class
文件并不是用来供人阅读的,它是机器码。不要费心在里面翻找了。此外,这里有一些可能对您有帮助的信息:https://dev59.com/7WIj5IYBdhLWcg3wpmoH#20030999 - Dioxin