Sobes.tech
Middle+

Jaké je odhadované množství paměti potřebné k uložení primitive typu byte v datové struktuře LinkedList?

sobes.tech AI

Odpověď od AI

Odhad paměti pro uložení jednoho primitivního byte v LinkedList<Byte>:

  1. Primitivní byte: zabírá sám o sobě 1 byte.
  2. Obalový objekt Byte: v LinkedList jsou uloženy objekty, nikoliv primitivní typy. byte bude automaticky zabalen do objektu Byte. Objekt Byte obsahuje:
    • Metadata objektu (hlavička): obvykle 8 nebo 12 byte (závisí na JVM).
    • Pole value: 1 byte (pro hodnotu typu byte).
    • Zarovnání: objekty jsou často zarovnány na velikost strojového slova (4 nebo 8 byte). Pokud hlavička má 12 byte + hodnota 1 byte = 13 byte, pravděpodobně bude zarovnáno na 16 byte.
  3. Uzel LinkedList.Node: každý prvek v LinkedList je zabalen do instance vnitřní třídy Node. Tento uzel obsahuje:
    • Metadata objektu (hlavička): 8 nebo 12 byte.
    • Pole item: odkaz na uložený objekt (v tomto případě objekt Byte). Odkaz obvykle zabírá 4 nebo 8 byte (v závislosti na JVM 32 nebo 64 bit a použití komprimovaných ukazatelů).
    • Pole next: odkaz na následující uzel. 4 nebo 8 byte.
    • Pole prev: odkaz na předchozí uzel. 4 nebo 8 byte.
    • Zarovnání: celková velikost polí a hlavičky uzlu je také zarovnána.

Minimální odhad (32bit JVM bez komprimovaných ukazatelů):

  • Objekt Byte: 12 byte (hlavička) + 1 byte (hodnota) + 3 byte (zarovnání) = přibližně 16 byte.
  • Uzel Node: 12 byte (hlavička) + 4 byte (odkaz item) + 4 byte (odkaz next) + 4 byte (odkaz prev) + 4 byte (zarovnání) = přibližně 28 byte.
  • Celková velikost: přibližně 16 + 28 = přibližně 44 byte.

Typický odhad (64bit JVM se zkrácenými ukazateli - výchozí pro haldu < 32GB):

  • Objekt Byte: 12 byte (hlavička) + 1 byte (hodnota) + 3 byte (zarovnání) = přibližně 16 byte.
  • Uzel Node: 12 byte (hlavička) + 4 byte (odkaz item) + 4 byte (odkaz next) + 4 byte (odkaz prev) + 0 byte (zarovnání, pokud jsou pole již zarovnána na 8 byte) = přibližně 24 byte.
  • Celková velikost: přibližně 16 + 24 = přibližně 40 byte.

Maximální odhad (64bit JVM bez zkrácených ukazatelů):

  • Objekt Byte: 12 byte (hlavička) + 1 byte (hodnota) + 3 byte (zarovnání) = přibližně 16 byte.
  • Uzel Node: 12 byte (hlavička) + 8 byte (odkaz item) + 8 byte (odkaz next) + 8 byte (odkaz prev) + 4 byte (zarovnání) = přibližně 40 byte (nebo 36+4).
  • Celková velikost: přibližně 16 + 40 = přibližně 56 byte.

Takže odhadovaná paměť pro uložení jednoho byte primitiva v LinkedList<Byte> je přibližně 40-60 byte, kvůli dodatečným nákladům na obalový objekt Byte a uzel LinkedList.Node. To je mnohem více než 1 byte samotného primitiva.