Как настроить JVM для ожидания вместо того, чтобы выбрасывать OutOfMemoryError - PullRequest
0 голосов
/ 20 декабря 2010

Как ждать сборщика мусора, вместо того чтобы выбросить OutOfMemoryError с помощью JVM?Есть ли какие-то настройки для параметров JVM или других (например, практики кода)?

Я не хочу вводить параметры памяти JVM или настраивать GC - только ждать GC без OutOfMemoryError, потому что я знаю, что нет утечек памяти, просто мусор предотвращает новое выделение.

Ответы [ 2 ]

4 голосов
/ 20 декабря 2010

Боюсь, ваш вопрос не имеет большого смысла.

Обычно выдается исключение OutOfMemoryException после , когда GC запустился и не удалось вернуть достаточно памяти длявам продолжить.Ожидание запуска GC (снова) вряд ли поможет.И если это не поможет, в результате ваше приложение просто зависнет.

Кроме того, нет способа сделать это.

2 голосов
/ 20 декабря 2010

Вероятно, вы можете настроить порог, когда JVM сдается и выбрасывает OOM, но это то, что JVM делает, когда обнаруживает, что сборка мусора ничего не выполняет. Обратите внимание, что JVM не будет генерировать OOM из-за неправильного времени или просто потому, что вы создали много объектов. Он обнаружит, что неоднократно запускал GC, и GC не освободил сколько-нибудь значительный объем памяти.

Некоторые возможности:

  1. Вы используете много памяти на постоянной основе. Это не обязательно утечка памяти, может быть, вы просто загружаете огромные данные и не понимаете, насколько они велики в памяти.
  2. У вас есть утечка памяти или, возможно, вы предпочитаете "память, использованную неожиданным образом". Java предлагает множество легких мест для потери памяти. Я был убит кешами ThreadLocal в библиотеке JSON и не смог вызвать новую строку (строку), когда это уместно.
  3. Временные данные перемещаются в PermGen, потому что они не действуют так же временно.
  4. У вас нет больших проблем, но вы выдвигаете конверт для объема памяти, который вы выделили, и вы не настроились должным образом. Включите одновременный сборщик мусора, включите ведение журнала GC и посмотрите, соответствует ли поведение вашим ожиданиям относительно того, что делает приложение.

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

...