我有一个作为服务工作的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)
答案 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版本 - 您的堆栈跟踪与当前版本中列表类的结构不匹配,因此您的问题可能不会发生(或导致更容易诊断的差异错误)一个更新的版本。