我正在尝试确定何时fork / join实现将堆栈溢出。
我知道编译器确定函数在编译时需要的最大堆栈空间。所以这些信息应该可以在我的java代码的.class文件中找到。但是,我似乎无法弄清楚如何达到这个价值。
我可以在运行时打印出来,还是有人能指出我在类文件中找到它的位置?这在gedit中都是乱码,所以我似乎无法找到它。
答案 0 :(得分:3)
没有简单的方法来判断方法调用是否会导致堆栈溢出。
虽然您可以确定方法在堆栈上需要的插槽的数量,但这并不能告诉您实际需要的字节数。
Java字节代码使用实际堆栈的抽象,其中堆栈被视为由抽象“槽”组成。 this-reference,方法参数和局部变量都占用堆栈上的一个或两个插槽(long和double需要两个插槽,everthing其他计为一个插槽)。这是您可以从类文件中获取的信息。
仍然缺少的是插槽实际上如何转换为堆栈内存,以及JIT实际上从字节代码创建的内容。 JIT可能会在执行优化时(例如代码不变运动)决定添加临时变量。
此外,当您调用本机方法时,无法确定调用将占用多少堆栈内存。
您看,很大程度上取决于当前的JRE,VM和平台。将此与缺少一个简单的内置方法来实际确定实际堆栈的大小相结合,这使得确定所需的堆栈数量和可用数量是不切实际的。
答案 1 :(得分:2)
JBE是一个很好的独立工具,可以让你浏览(和编辑)类文件。它显示的一个信息是某种方法的最大堆栈深度。如果JBE可以访问此信息,那么如果您打算使用字节码解析库,则可能会这样做。