Никогда не пытайтесь восстанавливаться из ошибки OutOfMemoryError, запуская System.gc ().Независимо от того, строго ли это гарантировано, вы можете найти его в JLS.Но это довольно плохая идея насквозь - JVM будет стараться изо всех сил, чтобы удовлетворить ваши желания выделения памяти.Когда он сдается и бросает OOM, игра заканчивается.Или уменьшите использование памяти или увеличьте размер кучи, а затем повторите попытку.
Чтобы более прямо ответить на ваш вопрос, перехват OutOfMemoryError не означает, что GC запущен.Например,
try {
throw new OutOfMemoryError();
} catch (OutOfMemoryError e) {
;
}
, вероятно, не будет вызывать GC.Очевидно, это абсурдный пример.Более реалистичным, который я видел недавно, был OOME с причиной «Не удалось выделить новый собственный поток».Выполнение GC, скорее всего, не разрешит подобную ситуацию, поскольку у JVM есть свободное пространство в куче, но система не допустит больше потоков.