Гарантируется ли сборщик мусора перед ошибкой вне памяти?

Если куча заполнена, JVM выбрасывает OutOfMemoryError. Но уверен ли, что (полная) сборка мусора всегда имеет место до того, как будет выброшено такое исключение?

Это означало бы, что память заполняется только сильными объектами, на которые ссылаются (или достижимыми GC Roots), когда генерируется исключение.

Изменить: предположим, что Sun JVM - HotSpot обсуждается.

Ответ 1

Спецификация машины Java заявляет в разделе 6.3 (выделено мной):

OutOfMemoryError: реализация виртуальной машины Java закончилась либо виртуальную или физическую память, , и менеджер автоматического хранения не смог для восстановления достаточного количества памяти для удовлетворения запроса на создание объекта.

Таким образом, JVM дает гарантию, что он попытается сделать все возможное, чтобы освободить память через сборку мусора, прежде чем он выбросит OOME.

Ответ 2

Коллекционер гаража обычно запускается до выброса OutOfMemoryError. Однако вы можете получить OOME без GC, если вы

  • попытайтесь создать очень большой объект (например, больше, чем куча)
  • запустите поток, и для запуска потока недостаточно виртуальной памяти или ресурсов.
  • более старые версии Java будут бросать эту ошибку, если вы достигнете максимальной максимальной памяти.

Ответ 3

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

Брошенный, когда виртуальная машина Java не может выделить объект, поскольку он неактивен, и сборщик мусора не может сделать доступной больше.

Обратите внимание, что есть случаи, когда сборщик мусора может решить, что достаточное количество памяти недоступно, даже не пытаясь отбросить экземпляры объектов без ссылок. Наиболее очевидным примером является попытка увеличить объем памяти за один раз (например, большой массив байтов), чем максимальный размер кучи. В этом случае OutOfMemoryError может быть выброшен без запуска сборщика мусора.

Ответ 4

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

Ответ 5

Есть другие дополнительные факторы, которые следует учитывать, помимо того, что люди уже ответили, например, политику сбора мусора, которую вы используете. Рассмотрите сборку мусора с пропускной способностью, это вызовет исключение из памяти, если слишком много времени будет потрачено на сбор, а нехватка памяти будет освобождена (хотя недавние изменения, возможно, изменили ситуацию). Сказав все это, я бы не предполагал, что сбор мусора происходит в любое время в ходе выполнения приложения, которое я пишу...