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

Вычисление байтового размера объекта Java

Я работаю над вычислением размера [памяти] java-объекта [hashmap]. Он содержит элементы разных типов данных [во время выполнения], поэтому [no-of-elem * size-of-element] не является хорошим подходом. Код прямо сейчас делает это по серии

if (x)
  do something
else if (primitives)
  lookup size and calculate

Однако этот процесс является болотом процессора и неэффективным.

Я думаю о следующих двух подходах:

  • Сериализуйте объект в буфер и получите размер.
  • Посмотрите на java.lang.instrument, чтобы получить размер

Я ищу опыт работы с этими подходами для производительности, эффективности, масштабирования и т.д. ИЛИ если вы знаете лучший способ.

P.S: Это фоновая утилита, которую я создаю, поэтому размер не должен быть слишком точным, хотя он должен быть прав. Поэтому я готов торговать с точностью до производительности

Меня не интересует глубокий размер (размер объектов, на которые ссылается этот объект, не будет вычислен.)

Я ищу сравнение производительности и понимание того, как getObjectSize() работает внутри.. так что я не перепутаю что-то еще, чтобы улучшить производительность

Спасибо

4b9b3361

Ответ 2

Сериализованный размер определенно не подходит, по двум причинам:

  • В стандартной сериализации Java может быть довольно много накладных расходов, которые добавили бы к размеру.
  • Это не было бы быстрее, чем использование метода getObjectSize(), который мы можем предположить, будет перебирать все ссылки и использовать некоторые вид поиска, чтобы определить размер примитивных значений/ссылок объекта.

Если вам нужна более высокая производительность, это будет зависеть от распределения ваших объектов. Одной из возможностей было бы сделать некоторую случайную выборку значений на вашей карте, определить среднее значение и рассчитать оценку этого значения.

Для получения справки о том, как искать случайное значение в хэш-карте, см. этот question.

Ответ 3

Вам может быть интересна статья, которую я написал некоторое время назад в как рассчитать использование памяти Java-объекта. Он, по общему признанию, нацелен в первую очередь на 32-битную точку доступа, хотя большая ее часть применима в основном к другим средам.

Вы также можете загрузить простой агент для измерения размера объекта Java с того же сайта, который потребует от него тяжелой работы для вы должны работать в 64-разрядных средах.

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