Настройка параметров сборки мусора в Java - PullRequest
5 голосов
/ 24 августа 2011

У меня есть серверный Java-компонент, у которого при запуске огромная потребность в памяти, которая постепенно уменьшается.Так, например, при запуске требование к памяти может составить 4g;который после первоначального всплеска понизится до 2g.Я настроил компонент для запуска с памятью 5g, и компонент запускается хорошо;используемая память увеличивается до 4g, а затем приближается к 2g.Объем памяти, используемой кучей, на данный момент все еще колеблется около 4g, и я хочу уменьшить ее (по сути, уменьшить объем свободной памяти до нескольких сотен мегабайт, а не 2g. Я попытался использовать MinFreeHeapRatio и MaxFreeHeapRatio, опустив их по сравнению со значениями по умолчаниюно это привело к тому, что сборка мусора не запускалась после начального запуска во время начального скачка, а используемая память оставалась на более высоком уровне, чем обычно. Любые указатели очень помогли бы.

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Во-первых, я спрашиваю, почему вы беспокоитесь об освобождении 2 ГБ оперативной памяти на сервере? 2 ГБ оперативной памяти составляет около 100 долларов или меньше. Если это на рабочем столе, думаю, я могу понять беспокойство.

Если у вас действительно есть веская причина подумать об этом, это может быть связано с алгоритмом сбора мусора, который вы используете. Некоторые алгоритмы возвращают неиспользуемую память обратно в ОС, некоторые - нет. Есть некоторые графики и такие, связанные с этим на http://www.stefankrause.net/wp/?p=14. Возможно, вы захотите попробовать сборщик G1, так как кажется, что он легко освобождает память для ОС.

Редактировать из комментариев Что, если они все решат максимизировать свою нагрузку сразу? Вы в порядке с некоторыми из них подкачки памяти на диск и замедления сервера для сканирования? Я бы запустил их на сервере с достаточным объемом памяти для запуска ВСЕХ приложений с максимальной кучей + еще 4-6 ГБ для ОС / кэширования. Серверы с 32 или 64 ГБ довольно распространены, и вы можете получить больше.

0 голосов
/ 25 августа 2011

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

Если у вас есть несколько компонентов, которые используют скачок памяти, вам следует переписать их, чтобы использовать меньше памяти при запуске или использовать несколько компонентов в одной JVM, чтобы дополнительная память была менее значимой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...