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