2010-01-14 2 views
1

Я пытаюсь понять размер, который будет выделен объект Java при создании с помощью нового оператора.Создание объекта Java и размер памяти

Считайте, что я создаю класс

public class NewClass { 

    NewClass() { } 

} 

когда я создаю экземпляр NewClass с помощью NewClass nc = new NewClass();. Каков размер NewClass, который создается в куче?

~ Jegan

ответ

0

Я думаю, вам нужно использовать профайлер для измерения этого. Вы можете использовать профилировщики JProfiler или YourKit.

9

профилирования является лучшим способом, но вы можете получить хорошую оценку, как так:

8 байт на объект (голые накладные расходы), плюс поле.

  • Примитивные поля: как указано на Java. Примечание: booleans нужно 1 полный байт.
  • Поля объекта: 1 указатель (4 байта на 32-разрядной виртуальной машине, 8 на 64-разрядной версии), плюс размер самого объекта (если не ссылка на существующий объект)
  • Массивы: 4 байта + объект/примитивы для элементов
  • Строки: далеко, слишком много. IIRC, 24 байта + 2 байта/символ. Может быть больше.

Конечный результат увеличен до ближайшего кратного 8 байт.

См. Также мой пример here, как рассчитать использование памяти на более сложном объекте. Примечание. Эти правила могут отличаться от виртуальных машин и могут изменяться по мере выхода новых версий VM. Моя оценка применима только к Sun JVM, хотя я подозреваю, что результаты IBM будут похожи.

+0

Обратите внимание, что «размер самого объекта» может не применяться, если вы ссылаетесь на объекты, которые уже существуют. То же самое касается элементов массива. –

+0

Я думал, что это предполагалось, но достаточно справедливо - я добавил пару квалификаторов, чтобы дать понять, при каких условиях эта оценка применяется. – BobMcGee

+0

Я бы сказал, что наложенные накладные расходы составляют 16 байт. (По крайней мере на 64-битных JVM) –