Обычно использование памяти трудно предсказать.
Переполнения стека из-за бесконечной регрессии обычно появляются в цикле записи / отладки.
Сложнее обнаружить проблемы с памятью в таких вещах, как большие коллекции, кэши и т. Д. Как уже указывалось, вы можете проверить свободную и максимальную память во время выполнения, но будьте осторожны, так как их значения не очевидны - «свободный» здесь означает «свободный сейчас», например, Это означает, что если вы запустили полный сборник, вы можете получить больше. К сожалению, нет способа получить «все возможное бесплатно, включая сборщик мусора» без запуска System.gc (), что нехорошо делать в производственном приложении (где вы склонны иметь достаточно большие наборы данных для вызвать проблему в первую очередь), потому что вся JVM остановится на несколько секунд (или больше, в большом приложении). Обратите внимание, что даже System.gc () не гарантированно запускается «сейчас», но мой опыт таков, что он выполнялся всякий раз, когда я играл с ним.
Вы можете распечатать действие gc из запущенной jvm, запустив java с -verbose: gc, -XX: + PrintGCTimeStamps и -XX: + PrintGCDetails (более подробно здесь ), и в общем случае сборщик начинает работать чаще, это, вероятно, признак того, что вам не хватает памяти.