2016-04-28 4 views
0

При расчете размера объекта JavaJava Instrumentation найти размер объекта

Class Test { 

    private String name = null; 

    private List<String> myList = null; 

} 

Верно ли размер испытания объекта класса будет отличаться, если у меня есть один элемент в списке по сравнению с тысячами пунктов в список?

+0

Попробуйте это и посмотрите, используя API-интерфейс инструментария, на который вы ссылаетесь. – hexafraction

+1

Не совсем, нет. «Тест» будет таким же; он всегда содержит только _reference_ в список, который живет где-то еще в памяти, и эта ссылка всегда имеет тот же размер. –

ответ

2

Ну, это зависит от того, как вы хотите посчитать это.

Test сам экземпляр не будет больше, он просто имеет ссылку на List экземпляр (или null, но и занимает столько же места), и что List экземпляр является его собственный объект, хранящийся в других местах куча (за пределами вашего Test экземпляра).

Экземпляр List (в зависимости от реализации) также не меняется по размеру, но в свою очередь ссылается на другие объекты (записи списков или массивы или другие вещи).

В общем случае все экземпляры класса в Java занимают фиксированное выделение памяти, которое определяется классом и не меняется от экземпляра к экземпляру. Единственное, что может иметь «динамический» размер, это массивы (но это не все так динамично, поскольку оно также фиксируется на время создания массива, поэтому оно может варьироваться от экземпляра к экземпляру, но не через какое-то время для данного экземпляра)

Если вы хотите вычислить «замыкание по графу объектов» всей памяти, необходимой для объекта Test и всех зависимостей/содержимого (например, чтобы оценить, сколько памяти необходимо для его сериализации в файл), тогда да , он будет расти в зависимости от количества объектов в списке.

Также обратите внимание, что ArrayList с ["foo", "foo"] может потреблять тот же общий объем пространства, как только ["foo", "foo", "foo"] (так же один экземпляр строки повторно использовать три раза, а массив поддержки имеет восемь записей в любом случае). Или у вас может быть несколько экземпляров Test, имеющих одинаковые List. Так что это не так просто и зависит от того, как вы хотите рассчитывать.

+0

Отличное объяснение всех тонких аспектов «того, что является размером объекта», хотя вычисление фактически занятой памяти в управляемой среде еще сложнее. Только одно небольшое замечание: емкость по умолчанию ArrayList составляет десять, а не восемь. – Holger