Сообщите мне то, что лучший способ состоит в том, чтобы определить состав молодой памяти поколения, способствовавшей старому поколению после каждого молодого события GC?
Идеально я хотел бы знать имена классов, которые ответственны, говорят, для 80% "кучи" в каждом "молодом генерале-> старый генерал" блок продвижения;
Пример: Я имею 600M молодой генерал, каждый срок продвигает 6M; я хочу знать, какие объекты составляют это 6M.
Спасибо.
Нет простого способа сделать это, однако я недавно анализировал производительность памяти больших java-приложений и могу поделиться некоторым опытом.
Вот как я узнал, какие объекты повышаются до старого поколения:
Сначала вам нужно определить, какие объекты находятся в "старом / существующем" пространстве. По сути, это стандартный анализ кучи java. Для этого я рекомендую jmap. Это часть sun jvm.
запустите:
jmap -dump: file = heap.hprof PID
, чтобы получить дамп кучи. Это приостановит jvm во время дампа (~ на 30 секунд в куче 2 ГБ)
Теперь загрузите файл .prof в анализатор памяти (лучший инструмент для этого, без сомнения) {{1} } Я бы потратил день, играя с анализатором памяти, чтобы понять это, смотреть экранную камеру (нужен логин, но оно того стоит).
Теперь вы будете знать, какие объекты находятся в вашей куче.
Уловка: на обзорном экране анализатора памяти есть ссылка на: «Гистограмма недоступных объектов». Теперь все эти объекты нужно собрать во время следующего сборщика мусора. Но некоторые, вероятно, в Эдеме, некоторые в живых, а некоторые в старых.
Теперь возьмите профилировщик с возможностью профилирования памяти, я предпочитаю yourKit. Запустите приложение с помощью yourkit и запишите распределение объектов.
Запустите его и запишите создание объекта. Создав список объектов, используйте все три списка, чтобы получить представление о том, что происходит. Делайте то, что у людей получается лучше всего, смотрите закономерности.
Другой способ подхода - представление поколений YourKit . Вы можете делать снимки своей кучи и сравнивать, какие объекты все еще живы, между снимками. Если вы используете это с visualgc , вы можете определить, как долго объект должен быть активен, чтобы его повысили до старого поколения, и делать снимки через эти интервалы, чтобы увидеть, какие объекты еще живы.
Что ж, удачи. / JT