YourKit - сохраненный размер объекта не равен сохраненному размеру всех объектов, на которые он ссылается.

Сохраненный размер объекта не равен сохраненному размеру всех объектов, на которые он ссылается.

Вот что происходит:

  1. Использование YourKit для захвата моментального снимка памяти.
  2. нажмите на объект и покажите экземпляры по типу класса
  3. скажем, сохраненная память экземпляра составляет A байт (600 МБ)
  4. разверните и суммируйте сохраненный размер для базовых экземпляров, скажем, сумма B (300 МБ)

A >> B


person hba    schedule 29.05.2014    source источник
comment
B ›› A было бы настоящей загадкой. Я предполагаю выравнивание или метаданные, но понятия не имею.   -  person keyser    schedule 29.05.2014
comment
Ну, я надеялся на A ~= B (почти то же самое)   -  person hba    schedule 29.05.2014


Ответы (1)


Позвольте привести пример.

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

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

В простом сохраняемый размер объекта действительно будет суммой объектов, на которые он ссылается. На рисунке ниже сохраненный размер Obj1 представляет собой сумму неглубокого размера Obj1 и сохраненного размера Obj2 и Obj3: простой случай

Это не относится к более сложным моделям ссылок. Если Obj6 начнет ссылаться на Obj5, то Obj5 не будет доступен только из Obj2. Таким образом, сохраненный размер Obj2 теперь будет включать только Obj4 и исключать Obj5. сохраненный размер Obj1 не является суммой Obj2 и Obj3 Сохраненный размер Obj1 останется прежним. Если сборщик мусора освободит Obj1, он освободит весь граф ссылок размером 41. Однако, если сборщик мусора освободит только Obj2, он не освободит Obj5, потому что на него по-прежнему будет ссылаться Obj6.

person Soid    schedule 02.02.2017
comment
Хороший ответ. Кажется, что это иногда затрудняет чтение дампов кучи. Во втором примере Obj5 не включен в сохраненный размер Obj2 или Obj3; он включен только в сохраненный размер Obj1. В сложном дампе кучи Obj5 может быть вложен многоуровневым. Есть ли у вас какие-либо предложения по решению этой проблемы при расследовании утечек памяти? - person DavidS; 21.03.2017