Расчет использования памяти Java объекта с VisualVM Heap Dump не совпадает с теоретическим подходом

Mixalis Navridis:

Все , что я пришел с простым вопросом. Согласно ява документации и многих статей о макете объекта памяти Java , если у нас есть класс с одной intпеременной общее потребление памяти для этого объекта будет:

  • 8 байт для заголовка
  • 4 байта для Int
  • 4 байта обивки (с круглым общим до быть кратными 8 байт) = 16 Всего байт
public class Ab {        
    int b;
}

public static void main(String args[]) throws InterruptedException {
    Ab ab = new AB();  
}  

Моя проблема сейчас в том , что , когда я использовал Визуальную виртуальную машину и посмотреть на свалке кучной соблюдать это теоретический подход , я заметил , что потребление памяти для этого объекта было 20 байт , а не 16 ? Почему это происходит? Может кто - нибудь объяснить мне?

Александр Пирогова:

Использование макета объекта Java инструмент , который я получил следующий вывод:

 OFFSET  SIZE   TYPE DESCRIPTION        VALUE
      0    12        (object header)    N/A
     12     4    int Ab.b               N/A

Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

И с -XX:-UseCompressedOopsопцией VM (отключить сжатые ссылки):

 OFFSET  SIZE   TYPE DESCRIPTION                                VALUE
      0    16        (object header)                            N/A
     16     4    int Ab.b                                       N/A
     20     4        (loss due to the next object alignment)

Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

Java среда:

java version "11" 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)

рекомендация

отhttp://43.154.161.224:23101/article/api/json?id=119382&siteId=1