Java GC: верхние классы объектов повышены (по размеру)? - PullRequest
6 голосов
/ 25 февраля 2010

Пожалуйста, дайте мне знать, как лучше определить состав памяти молодого поколения, передаваемой старому поколению, после каждого события молодого GC?

В идеале я хотел бы знать имена классов, которые ответственны, скажем, за 80% кучи в каждом блоке продвижения "young gen -> old gen";

Пример: у меня есть 600 миллионов молодых людей, каждое пребывание в должности повышает 6 миллионов; Я хочу знать, какие объекты составляют эти 6M.

Спасибо.

1 Ответ

6 голосов
/ 18 марта 2010

Нет простого способа сделать это, однако я недавно анализировал производительность памяти в больших Java-приложениях и могу поделиться некоторым опытом.

Вот как я нашел, какие объекты продвигаются до старого поколения:

Сначала вам нужно определить, какие объекты находятся в «старом / арендованном» пространстве. В основном это стандартный анализ кучи Java. Для этого я рекомендую jmap. Это часть солнца JVM. бежать: jmap -dump:file=heap.hprof PID чтобы получить кучу свалок. Это приостановит jvm во время дампа (~ на 30 секунд на куче 2 ГБ)

Теперь загрузите файл .prof в Анализатор памяти (лучший инструмент для этого, руки вниз) Я бы потратил день, играя с анализатором памяти, чтобы понять это, посмотреть на экран камеры (нужен логин, но оно того стоит).

Теперь вы будете знать, какие объекты находятся в вашей куче.

Вот хитрость: на обзорном экране анализатора памяти есть ссылка на: «Гистограмма недоступных объектов». Теперь все эти объекты должны быть собраны во время следующего GC. Но некоторые, вероятно, в Эдеме, некоторые в живых и некоторые в старых.

Теперь, получите профилировщик с возможностью профилирования памяти, я предпочитаю yourKit. Запустите ваше приложение с yourkit и запишите распределение объектов.

Запустите его и запишите создание объекта. Когда у вас есть список созданных объектов, используйте все три списка, чтобы получить представление о том, что происходит. Делайте то, что люди делают лучше всего, смотрите шаблоны.

  • Какие объекты созданы и достижимы. (Анализатор памяти)
  • Объекты, недоступные в куче (анализатор памяти)
  • Объекты, созданные во время выполнения (Profiler)

Еще один способ подойти - это YourKit представление поколений . Вы можете делать снимки своей кучи и сравнивать, какие объекты все еще живы между снимками. Если вы используете это с visualgc , вы можете определить, как долго объект должен быть живым, чтобы перейти в старое поколение, и делать снимки с этими интервалами, чтобы увидеть, какие объекты еще живы.

Ну, удачи. / JT

...