Как заранее узнать об ошибках OutOfMemory или StackOverflow - PullRequest
8 голосов
/ 27 апреля 2009

Есть ли в Java способ узнать, что ошибка StackOverflow или исключение OutOfMemory могут произойти в ближайшее время?

Исключение OutOfMemory может быть легче поймать, если можно программно получать статистику использования памяти и заранее знать, сколько памяти необходимо использовать, прежде чем будет выдано исключение OutOfMemory. Но можно ли узнать эти ценности?

Для ошибки StackOverflow существует ли способ получить глубину рекурсии и как узнать, какое значение глубины рекурсии может вызвать ошибку?

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

Ответы [ 12 ]

0 голосов
/ 27 апреля 2009

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

1) Вы можете использовать Findbugs , что может указывать на некоторые ошибки StackOverFlow, возникающие из-за непреднамеренного вызова того же самого метода из самого себя.

2) Вы можете хранить данные, которые могут вызвать нехватку памяти с помощью SoftReference, и иметь нулевую проверку на доступ к ним, чтобы их можно было перезагрузить, если они были собраны сборщиком мусора.

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

0 голосов
/ 27 апреля 2009

Вы можете многое узнать о глубине рекурсии, создав объект Throwable и запросив его метод getStackTrace (). Но это дорого.

Если у вас действительно есть метод с небольшим потенциалом генерирования ошибки StackOverflowError или OutOfMemoryError, почему бы просто не вставить блоки try-catch и перехватить эти ошибки? Они могут быть перехвачены и обработаны как проверенные исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...