Поиск горячих точек распределения памяти в java - программирование
Подтвердить что ты не робот

Поиск горячих точек распределения памяти в java

Наш GC работает, и у нас есть несколько пауз, которые мы хотим уменьшить. У нас есть некоторые проблемы с распределением памяти, которые мы хотим решить до или во время настройки с фактическими аргументами JVM GC.

Я хотел бы знать, какие объекты делают пот GC:

  • Есть ли способ узнать, какие объекты эвакуируются каждый раз, когда GC работает?
  • есть способ узнать, какие объекты перемещаются между областей каждый раз, когда GC работает?
  • Есть ли способ узнать, какие объекты находятся в области Eden?

Я активно работаю с Jprofiler и Memory Analyzer. Я хотел бы получить эту информацию о запущенном приложении в моей промежуточной среде.

4b9b3361

Ответ 1

Для 2 и 3 вы можете использовать флаги -XX:+PrintGCDetails и -XX:+PrintGCTimeStamps с исполняемым файлом Oracle или OpenJDK java во время сеанса запуска вашего приложения

Ответ 2

В вопросе 1 можно использовать Phantom Ссылки. Это позволит вам получать уведомления о том, что объект GC'ed (или GC-able).

Что касается двух других, я не совсем знаю.

Ответ 3

Поиск выделения памяти в запущенной JVM может принести большие усилия.

Вместо этого вы можете проверить hotspot исходный код и добавить свои собственные журналы в случае GC или выделения. Компилируйте свою собственную точку доступа и отслеживайте журналы.


Использование -XX:+PrintCompilation может помочь вам.

Выход флага -XX:+PrintCompilation выглядит примерно так:

1  sb   java.lang.ClassLoader::loadClassInternal  (6 bytes)     
2  b    java.lang.String::lastIndexOf  (12 bytes)
3  s!b  java.lang.ClassLoader::loadClass  (58 bytes)

Флаги соответствуют:

b    Blocking compiler (always set for client)  
*    Generating a native wrapper    
%    On stack replacement   
!    Method has exception handlers  
s    Synchronized method    

Подробнее.

Ответ 4

Мы, вероятно, попытаемся использовать некоторые байтовые инструменты для добавления finalize (возможно, Object), которые предоставят нам эту информацию в журнале.

Ответ 5

Содержимое пространства OldGen:. Вы можете узнать, какие объекты находятся в OldGen. Вам нужно распечатать гистограммы до и после Full GC: -XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC. И так как коллекция YoungGen выполняется до полного GC, эти гистограммы покажут вам содержание старого поколения.

Обнаружение преждевременно продвигаемых объектов:. Чтобы определить, продвигаются ли какие-либо экземпляры на раннем этапе, вам необходимо изучить гистограммы, чтобы увидеть, какие классы должны находиться в OldGen, и какие классы следует рассматривать только в YoungGen. Это невозможно сделать автоматически, вам нужно рассуждать о цели каждого класса и его экземпляра, чтобы определить, является ли объект временным или нет.

Содержимое пространства YoungGen/Eden: Я не нашел способа, каким образом различать, какие объекты находятся, например. в Идене. Как вы, вероятно, знаете, jProfiler и MemoryAnalyzer могут сбросить кучу, но это не скажет вам, в какой области находятся объекты. Но вы также можете делать снимки гистограммы через регулярные промежутки времени, а затем писать простой script, который будет анализировать выходные данные и указывать, какие экземпляры растут быстрее, используйте: jmap -histo $pid.