Сборка мусора перед OutOfMemoryError - PullRequest
2 голосов
/ 13 декабря 2011

Это вопрос о сборке мусора в java: если кто-то выделяет большой блок памяти (используя новый int [BIG_NUMBER] или, тем не менее), есть ли какая-либо гарантия, что сборщик мусора будет собирать мусор до того, как возникнет ошибка OutOfMemoryError?Является ли это поведение сборщика мусора частью спецификации Java на данный момент?

Я узнал, что сборщик мусора сам может вызвать такое исключение в случае, если сбор мусора занимает слишком много времени, по крайней мере, в случаеВиртуальная машина Java Sun Hotspot

«Параллельный / параллельный сборщик сгенерирует ошибку OutOfMemoryError, если на сборку мусора затрачивается слишком много времени: если на сборку мусора затрачивается более 98% общего количества и меньше 2% кучи восстанавливается, OutOfMemoryError будет выдан.Эта функция предназначена для предотвращения запуска приложений в течение длительного периода времени при небольшом прогрессе или его отсутствии, поскольку куча слишком мала.При необходимости эту функцию можно отключить, добавив параметр -XX: -UseGCOverheadLimit в командную строку.»

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

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

AFAIK, он всегда был частью спецификации.

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

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

Из Javadoc для Java 1.4.2 (выпущен в 2002 г.) http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/OutOfMemoryError.html

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

0 голосов
/ 13 декабря 2011

Это просто, нет. Ваша программа может вызвать Runtime.gc () за помощью.

...