Подтвердить что ты не робот

Как оценить общее потребление памяти перм класса?

В последнее время я писал класс, в котором я обнаружил, что я мог сократить потребление памяти экземплярами на ~ 10 байт/элемент, но только ценой сделать код намного сложнее. Это увеличило размер скомпилированного файла .class на ~ 10 КБ.

Я предполагаю, что JVM должен загрузить файл .class в память, поэтому эти изменения не будут платить сами за себя, если не будет по меньшей мере 1000 элементов или около того. Но эта арифметика не работает, если дополнительные 10KB в файле класса не являются единственной ценой повышенной сложности кода.

Этот блог Oracle предполагает, что существует достаточное количество дополнительной памяти, потребляемой классом в permgen, которая не просто основана на .class - например, я подозреваю, что для более сложного кода может потребоваться больше памяти для метаданных оптимизации.

Итак, этот вопрос состоит из двух частей:

  • Как я могу измерить фактическое потребление памяти в перменом определенного класса? Либо во время работы с некоторыми инструментами, либо с помощью инструментов профилирования?
  • Есть ли способ оценить потребление памяти пермгеном класса, когда я его пишу? (С некоторые базовые знания, вы можете оценить потребление памяти экземпляров класса, когда вы их пишете, мне интересно, можем ли мы оценить потребление памяти перментома самого класса.)

Подобные детали для Dalvik VM будут оценены, но я в основном сосредоточен на OpenJDK и других "обычных" JVM.

4b9b3361

Ответ 1

Как я могу измерить потребление памяти перменов определенного класса? Либо во время работы с некоторыми инструментами, либо с помощью инструментов профилирования?

Одним из подходов может быть загрузка класса для измерения в другом загрузчике классов и использование jmap -permstat, как представлено в этой записи в блоге.

Для каждого объекта загрузчика класса печатаются следующие данные:

  • Адрес объекта загрузчика класса - при снимке, когда была запущена утилита.
  • Количество загруженных классов (определяется этим загрузчиком с помощью метода (java.lang.ClassLoader.defineClass).
  • Примерное количество байтов, потребляемых метаданными для всех классов, загруженных этим загрузчиком классов.
  • Адрес загрузчика родительского класса (если есть).
  • Индикация "живое" или "мертвое" - указывает, будет ли объект-загрузчик собирать мусор в будущем.
  • Имя класса этого загрузчика классов.

Ответ 2

Это ответ на второй пункт; Я не уверен, насколько это было бы полезно, но я нашел слайды в презентации Создание эффективных приложений Java для Java: практика и проблемы чтобы быть весьма полезным при оценке размера и работоспособности различных объектов Java. Он подробно разбирается при оценке размеров объектов в 32-битных и 64-битных JVM, а также предоставляет указатели, чтобы сделать ваш объект более эффективным с точки зрения памяти.