如何扩展Java堆栈跟踪的大小以查看堆栈的底部?(触发堆栈溢出)

在Java中,有没有办法查看完整的,未截断的堆栈跟踪(例如,通过增加记录的帧数),或者以其他方式获取堆栈跟踪的底部?通常,堆栈跟踪从顶部截断,值为1024帧,但对于堆栈溢出问题,这是相当没有价值的,因为您确实需要查看谁进行了触发递归的调用,在底部附近。最好在堆栈中间截断,但显然Sun的JVM不够智能,无法做到这一点。

也许甚至是一些特殊的太阳专用旗帜?我试图将堆栈大小减少到允许的最小值(-Xss1000),但这仍然超过1024帧的价值。

在我的情况下,我正在尝试调试Hadoop映射器中发生的堆栈溢出,但只有在非常大的输入上运行时。我假设问题来了,因为递归操作(Scala的)正在一个非常非常大的链表上完成,我需要非递归地重写它......但我需要知道是谁打来的电话。这是一个在很多地方直接和间接调用的基本例程,并且有很多很多我正在使用的代码,所以这是非常不明显的。foldRightfoldRight


答案 1

请尝试 JVM 选项。-XX:MaxJavaStackTraceDepth

这是来自Stas博客的描述

最大编号堆栈跟踪中 Java 异常的行数(0 表示全部)。对于 Java > 1.6,值 0 实际上表示 0。必须指定值 -1 或任何负数才能打印所有堆栈(在 Windows 上使用 1.6.0_22、1.7.0 进行测试)。对于Java <= 1.5,值0表示一切,JVM扼流于负数(在Windows上使用1.5.0_22测试)。