无法跟踪堆栈溢出错误的来源

时间:2011-10-19 09:12:41

标签: java stack-overflow

我有一个作为服务工作的Java应用程序。运行几天后,我收到堆栈溢出错误。问题是我的源中发生错误的堆栈帧不在printStackTrace函数报告的错误中。我不知道如何找到问题所在。

这是printStackTrace的结果:

java.lang.StackOverflowError
    at java.util.LinkedList.listIterator(LinkedList.java:684)
    at java.util.SubList$1.<init>(AbstractList.java:700)
    at java.util.SubList.listIterator(AbstractList.java:699)
    at java.util.SubList$1.<init>(AbstractList.java:700)
    at java.util.SubList.listIterator(AbstractList.java:699)
    at java.util.SubList$1.<init>(AbstractList.java:700)
    at java.util.SubList.listIterator(AbstractList.java:699)
        ... (this is repeated hundreds of times)
    at java.util.SubList.listIterator(AbstractList.java:699)
    at java.util.SubList$1.<init>(AbstractList.java:700)
    at java.util.SubList.listIterator(AbstractList.java:699)
    at java.util.SubList$1.<init>(AbstractList.java:700)

2 个答案:

答案 0 :(得分:3)

您的问题可以转载如下:

List<String> l = ...;

for (int i = 0; i < 2800; i++) {
    l = l.subList(...);
}
l.listIterator(...);

因此,请注意subList()的所有调用,并确保它们不会像上面那样形成一长串子列表。

这样的链是递归结构(每个子列表保持对其父列表的引用),并且在非常长的链上调用listIterator()会导致非常深的递归,从而导致堆栈溢出。

答案 1 :(得分:1)

查看List.subList()方法的用法 - 这是唯一可以获得java.util.SubList实例的地方(具有包可见性的类)。

您还可以尝试升级到更新的Java版本 - 您的堆栈跟踪与当前版本中列表类的结构不匹配,因此您的问题可能不会发生(或导致更容易诊断的差异错误)一个更新的版本。