В последнее время я писал класс, в котором я обнаружил, что я мог сократить потребление памяти экземплярами на ~ 10 байт/элемент, но только ценой сделать код намного сложнее. Это увеличило размер скомпилированного файла .class
на ~ 10 КБ.
Я предполагаю, что JVM должен загрузить файл .class
в память, поэтому эти изменения не будут платить сами за себя, если не будет по меньшей мере 1000 элементов или около того. Но эта арифметика не работает, если дополнительные 10KB в файле класса не являются единственной ценой повышенной сложности кода.
Этот блог Oracle предполагает, что существует достаточное количество дополнительной памяти, потребляемой классом в permgen, которая не просто основана на .class
- например, я подозреваю, что для более сложного кода может потребоваться больше памяти для метаданных оптимизации.
Итак, этот вопрос состоит из двух частей:
- Как я могу измерить фактическое потребление памяти в перменом определенного класса? Либо во время работы с некоторыми инструментами, либо с помощью инструментов профилирования?
- Есть ли способ оценить потребление памяти пермгеном класса, когда я его пишу? (С некоторые базовые знания, вы можете оценить потребление памяти экземпляров класса, когда вы их пишете, мне интересно, можем ли мы оценить потребление памяти перментома самого класса.)
Подобные детали для Dalvik VM будут оценены, но я в основном сосредоточен на OpenJDK и других "обычных" JVM.