Вероятно, вы можете настроить порог, когда JVM сдается и выбрасывает OOM, но это то, что JVM делает, когда обнаруживает, что сборка мусора ничего не выполняет. Обратите внимание, что JVM не будет генерировать OOM из-за неправильного времени или просто потому, что вы создали много объектов. Он обнаружит, что неоднократно запускал GC, и GC не освободил сколько-нибудь значительный объем памяти.
Некоторые возможности:
- Вы используете много памяти на постоянной основе. Это не обязательно утечка памяти, может быть, вы просто загружаете огромные данные и не понимаете, насколько они велики в памяти.
- У вас есть утечка памяти или, возможно, вы предпочитаете "память, использованную неожиданным образом". Java предлагает множество легких мест для потери памяти. Я был убит кешами ThreadLocal в библиотеке JSON и не смог вызвать новую строку (строку), когда это уместно.
- Временные данные перемещаются в PermGen, потому что они не действуют так же временно.
- У вас нет больших проблем, но вы выдвигаете конверт для объема памяти, который вы выделили, и вы не настроились должным образом. Включите одновременный сборщик мусора, включите ведение журнала GC и посмотрите, соответствует ли поведение вашим ожиданиям относительно того, что делает приложение.
Наконец, запустите профилировщик и посмотрите, на что вы используете память. Первая итерация любой программы почти всегда приводит к огромным низко висящим фруктам для очистки.