Java 6 потребляет больше памяти, чем вы ожидаете для больших приложений?
У меня есть приложение, которое я разрабатывал в течение многих лет, и до сих пор занимало около 30-40 МБ в моей конкретной тестовой конфигурации; теперь с Java 6u10 и 11 он занимает несколько сотен, пока активен. Он много отскакивает, где-то между 50M и 200M, и когда он простаивает, он делает GC и сбрасывает память прямо вниз. Кроме того, он генерирует миллионы ошибок страниц. Все это наблюдается через диспетчер задач Windows.
Итак, я запустил его под своим профилировщиком (jProfiler) и используя jVisualVM, и оба они указывают на обычное умеренное использование кучи и perm-gen около 30M вместе, даже когда я полностью активен, выполняя мой цикл нагрузочных испытаний. 1007 *
Так что я озадачен! И это не просто запрос дополнительной памяти из пула виртуальной памяти Windows - это отображается как 200M «Использование памяти».
ПОЯСНЕНИЕ: я хочу быть совершенно ясным в этом - наблюдалось в течение 18 часов с Java VisualVM, что куча классов и куча perm gen были совершенно стабильны. Выделенная энергозависимая куча (eden и tenured) остается неподвижной на 16 МБ (которой она достигает в первые несколько минут), и использование этой памяти колеблется в идеальном порядке равномерного роста от 8 МБ до 16 МБ, после чего GC начинает работать сбрасывает его обратно до 8 МБ. В течение этого 18-часового периода система находилась под постоянной максимальной нагрузкой, так как я проводил стресс-тест. Такое поведение идеально и последовательно воспроизводимо, наблюдаемое в многочисленных сериях. Единственная аномалия заключается в том, что при использовании памяти из Windows, наблюдаемой через диспетчер задач, она колеблется от 64 МБ до 900+ МБ.
ОБНОВЛЕНИЕ 2008-12-18: Я запустил программу с -Xms16M -Xmx16M без каких-либо явных негативных последствий - производительность хорошая, общее время работы примерно одинаково. Но использование памяти за короткий промежуток времени все еще достигло максимума на 180M.
Обновление 2009-01-21: Кажется, что ответ может быть в числе тем - см. Мой ответ ниже.
РЕДАКТИРОВАТЬ: И я имею в виду миллионы ошибок страницы буквально - в области 30M +.
РЕДАКТИРОВАТЬ: У меня есть машина 4G, поэтому 200M не имеет значения в этом отношении.