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