Я могу очистить stacktrace?

Я знаю, что могу получить трассировку стека с помощью Thread.getAllStackTraces () (он возвращает карту, но очистить не работает). Когда я запускаю метод рекурсии, я могу получить исключение из-за слишком большого размера stacktrace, есть ли способ его очистить?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 134
3

Ответы 3

Проблема не в трассировке стека, а в самом стеке. Каждый раз, когда вы вызываете метод, информация помещается в стек, что позволяет вам вернуться к вызывающему методу. Если вы выполняете достаточно рекурсии, в конечном итоге вы заполняете все пространство в стеке (которое ограничено максимальным размером), и ваша программа останавливается. Трассировка стека просто показывает вашу историю вызовов. Вероятно, у вас происходит бесконечная рекурсия, и вам нужно найти способ остановить ее до того, как ваша программа выйдет из строя. Либо в вашем алгоритме есть ошибка, либо вам нужно найти способ решить ее по-другому в пределах доступной вам памяти.

Если вы столкнулись с переполнением стека из-за выхода рекурсии из-под контроля, вам не повезло. Содержимое стека необходимо для возврата из вызовов функций, разумно «очистить» его невозможно. Проблема не в Map, возвращаемом getAllStackTraces (), а в фактическом содержимом стека.

Вам необходимо реструктурировать свой код, чтобы он не возвращался на такой глубокий уровень.

В качестве альтернативы вы можете исследовать, возможно ли увеличить размер стека, но требование нестандартного размера стека обычно является признаком проблемной реализации.

Если стоит задача построить ЧРЕЗВЫЧАЙНО глубокое дерево в JSON - нечего называть «проблемной реализацией». Это задача, и рост размера стека влияет на ВСЕ потоки, что очень плохо для тяжелого многопоточного приложения. Я до сих пор не могу найти решение для этого.

Andrew Snejovski 27.07.2018 21:42

Сначала убедитесь, что в коде вашей программы нет ошибки, вызывающей бесконечную рекурсию, приводящую к переполнению стека.

Если это не так, вы можете попытаться выделить для своей программы больше места в стеке. В Linux это можно сделать с помощью команды ulimit bash, например:

ulimit -s 8000

или даже

ulimit -s unlimited

Если вам действительно нужно раскрутить стек, вы можете использовать setjmp / longjump в C или использовать исключения или продолжения, например:

struct ClearStack {} ;

void myLongComputationWhichCausesStackOverflow() {
  // do something
  if (needsToClearTheStack)
    throw ClearStack() ;
  // do something else
}

int main(int ac, char *av[]) {
  try {
    mylongcomputation() ;
    // continuation of program
    // no stack clearing occurred
  }
  catch(const ClearStack & cs) {
    // the stack was cleared and do something appropriately
  }
}

Он делает то, что вы хотите, но это не совсем хороший стиль программирования. Обратите внимание, что вам нужно придумать способ узнать, когда очищать стек. Это может быть довольно сложно, поскольку вы не можете знать, сколько места в стеке осталось, или вызов функции приведет к переполнению стека!

Это полезная информация, но не относится к этому вопросу.

Steve g 16.10.2008 17:56

Другие вопросы по теме