Sobes.tech
Middle+

Aká je odhadovaná veľkosť pamäte potrebná na uloženie primitive typu byte v dátovej štruktúre LinkedList?

sobes.tech AI

Odpoveď od AI

Odhad pamäte na uloženie jedného primitiv byte v LinkedList<Byte>:

  1. Primitívny byte: Zaberá 1 bajt sám o sebe.
  2. Objektová obálka Byte: V LinkedList sa ukladajú objekty, nie primitivy. byte bude automaticky zabalený do objektu Byte. Objekt Byte obsahuje:
    • Metadata objektu (hlavička): Zvyčajne 8 alebo 12 bajtov (závisí od JVM).
    • Pole value: 1 bajt (pre hodnotu typu byte).
    • Zarovnanie: Objekty sa často zarovnávajú na veľkosť strojovej slová (4 alebo 8 bajtov). Ak je hlavička 12 bajtov + hodnota 1 bajt = 13 bajtov, pravdepodobne bude zarovnané na 16 bajtov.
  3. Uzol LinkedList.Node: Každý prvok v LinkedList je obalený v vnútornom triede Node. Tento uzol obsahuje:
    • Metadata objektu (hlavička): 8 alebo 12 bajtov.
    • Pole item: Referencia na uložený objekt (v tomto prípade, objekt Byte). Referencia zaberá zvyčajne 4 alebo 8 bajtov (závisí od 32- alebo 64-bitovej JVM a použitia komprimovaných ukazovateľov).
    • Pole next: Referencia na ďalší uzol. 4 alebo 8 bajtov.
    • Pole prev: Referencia na predchádzajúci uzol. 4 alebo 8 bajtov.
    • Zarovnanie: Celková veľkosť polí a hlavičky uzla sa tiež zarovnáva.

Minimálna odhad (JVM 32-bit bez komprimovaných ukazovateľov):

  • Objekt Byte: 12 bajtov (hlavička) + 1 bajt (hodnota) + 3 bajty (zarovnanie) = približne 16 bajtov.
  • Uzol Node: 12 bajtov (hlavička) + 4 bajty (referencia item) + 4 bajty (referencia next) + 4 bajty (referencia prev) + 4 bajty (zarovnanie) = približne 28 bajtov.
  • Celková veľkosť: približne 44 bajtov.

Typický odhad (64-bit JVM so zhutnenými ukazovateľmi - podľa predvoleného nastavenia pre haldu < 32GB):

  • Objekt Byte: 12 bajtov (hlavička) + 1 bajt (hodnota) + 3 bajty (zarovnanie) = približne 16 bajtov.
  • Uzol Node: 12 bajtov (hlavička) + 4 bajty (referencia item) + 4 bajty (referencia next) + 4 bajty (referencia prev) + 0 bajtov (zarovnanie, ak sú polia už zarovnané na 8 bajtov) = približne 24 bajtov.
  • Celková veľkosť: približne 40 bajtov.

Maximálny odhad (64-bit JVM bez zhutnených ukazovateľov):

  • Objekt Byte: 12 bajtov (hlavička) + 1 bajt (hodnota) + 3 bajty (zarovnanie) = približne 16 bajtov.
  • Uzol Node: 12 bajtov (hlavička) + 8 bajtov (referencia item) + 8 bajtov (referencia next) + 8 bajtov (referencia prev) + 4 bajty (zarovnanie) = približne 40 bajtov.
  • Celková veľkosť: približne 56 bajtov.

Takže odhad pamäte na uloženie jedného primitiv byte v LinkedList<Byte> je približne 40-60 bajtov kvôli režii objektného obalu Byte a uzla LinkedList.Node. Toto je výrazne viac ako 1 bajt samotného primitiva.