Java VM и использование системной памяти
Apr. 30th, 2008 02:48 pmСегодня после разговора с товарищем об одной небольшой проблеме, я немного погуглил на тему того, что ему сказал. И, как ни странно, обнаружил интересную вещь. Я всегда считал, что если Java "съела" системную память себе под heap, она уже её никогда не отдаст, пока процесс не закончится. Это как бы стандартное поведение Жавы и все с этим примирились. Оказалось, что не совсем так. Стандартные установки 1.6 HotSpot JVM говорят, что если после работы GC свободно 70% heap, то тогда можно отдать системе столько памяти, чтобы осталось 40% heap свободными1. Такая ситуация встречается весьма редко в жизни. Так что если вам действительно нужно запустить Java процесс c редкими пиками использования памяти, и даже факт того, что физически незанятый heap будет слит на диск по pagination и не будет мешать другим процессам, не помогает, то вот решение, которое я только что проверил и отлично сработало на моей IntelliJ IDEA с загрузкой-выгрузкой огромного (200мб) проекта:
[1]больше информации о проблеме и решениях на Сане
UPD: поработал с этими установками в IntelliJ IDEA 2 дня, не выключая. В конце концов началось странное поведение: то говорит что памяти не хватает и просить увеличить -Xmx, хотя там еще 300 мегабайт. То подвисает на минуту-другую неожиданно. Обычно я не закрываю IDEA неделями, и без проблем. Так что, в общем, обращаться надо с осторожностью.
-XX:NewRatio=2 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30(читать про флаги тут)
[1]больше информации о проблеме и решениях на Сане
UPD: поработал с этими установками в IntelliJ IDEA 2 дня, не выключая. В конце концов началось странное поведение: то говорит что памяти не хватает и просить увеличить -Xmx, хотя там еще 300 мегабайт. То подвисает на минуту-другую неожиданно. Обычно я не закрываю IDEA неделями, и без проблем. Так что, в общем, обращаться надо с осторожностью.