Невозможно отследить источник ошибки переполнения стека - PullRequest
3 голосов
/ 19 октября 2011

У меня есть приложение 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 ]

3 голосов
/ 19 октября 2011

Вашу проблему можно воспроизвести следующим образом:

List<String> l = ...;

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

Итак, обратите внимание на все вызовы subList() и убедитесь, что они не образуют длинную цепочку подсписков, как указано выше.

Такая цепочка является рекурсивной структурой (каждый подсписок хранит ссылку на свой родительский список), а вызов listIterator() в очень длинной цепочке вызывает очень глубокую рекурсию, которая вызывает переполнение стека.

1 голос
/ 19 октября 2011

Найдите использование метода List.subList() - это единственное место, где вы можете получить экземпляр java.util.SubList (класс с видимостью пакета).

Вы также можете попробовать перейти на более новую версию Javaверсия - ваша трассировка стека не соответствует структуре классов списков в текущих версиях, поэтому ваша проблема может не возникнуть (или привести к другой ошибке, которую легче диагностировать) в более текущей версии.

...