Когда Java не может получить достаточно памяти для выделения объекта, вы получите OutOfMemoryError .
На практике исключение может занять довольно много времени, чтобы его фактически выдало JVM.Когда возникает проблема с памятью, JVM сначала пытается собрать как можно больше памяти.В зависимости от конфигурации JVM (параметры GC и максимальная память кучи) цикл GC может занять от нескольких секунд до нескольких минут, если для Xmx установлено несколько гигабайт.Еще хуже, в зависимости от необходимой памяти, JVM может выполнить несколько циклов GC, прежде чем выдать исключение.
Когда исключение является throw, оно обрабатывается как любое необработанное исключение.Как таковой он будет распространяться на вершину стека вызовов потока, где возникло исключение.Поскольку исключение не обработано, поток покажет трассировку стека на System.err
перед смертью.Это все.В однопоточной программе это приведет к ее завершению.В многопоточной программе эта смерть потока может освободить достаточно памяти для продолжения работы программы в нестабильной конфигурации.
Моя рекомендация, если вас беспокоит проблема с памятью, - это зарегистрироваться и UncaughtExceptionHandler для уничтожения вашей программы при возникновении проблемы с памятью, поскольку, безусловно, лучше остановить вашу программу, чем позволить ей работать в неопределенном состоянии, когда никто не знает.
Вы можете прочитать следующие статьи из Heinz Kabutzпо теме: