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