Sobes.tech
Middle+

Kokia yra numatoma atminties kiekio, reikalingo vienam byte tipo primityvui saugoti LinkedList duomenų struktūroje, vertė?

sobes.tech AI

Atsakymas iš AI

Atlikus įvertinimą atminties, skirtos saugoti vieną byte primityvą LinkedList<Byte>:

  1. Primitivas byte: užima 1 baitą.
  2. Objekto apvalkalas Byte: LinkedList saugo objektus, o ne primityvus. byte automatiškai įpakavimas į Byte objektą. Byte objektas apima:
    • Objekto metadatas (antraštė): paprastai 8 arba 12 baitų (priklauso nuo JVM).
    • Laukas value: 1 baitas (byte tipo reikšmei).
    • Lygiavimas: Dažnai objektai lygiuojami iki mašinos žodžio dydžio (4 arba 8 baitai). Jei antraštė yra 12 baitų + reikšmė 1 baitas = 13 baitų, tikėtina, kad bus lygiuojama iki 16 baitų.
  3. LinkedList.Node mazgas: Kiekvienas elementas LinkedList yra apgaubtas vidiniame Node klasės objekte. Šis mazgas turi:
    • Objekto metadatas (antraštė): 8 arba 12 baitų.
    • Laukas item: nuoroda į saugomą objektą (šiuo atveju, Byte objektą). Nuoroda dažniausiai užima 4 arba 8 baitus (priklauso nuo 32 arba 64 bit JVM ir naudojamų suspaustų nuorodų).
    • Laukas next: nuoroda į kitą mazgą. 4 arba 8 baitai.
    • Laukas prev: nuoroda į ankstesnį mazgą. 4 arba 8 baitai.
    • Lygiavimas: Bendra dydis ir mazgo antraštė taip pat yra lygiuojami.

Minimalus įvertinimas (JVM 32-bit be suspaustų nuorodų):

  • Byte objekto dydis: 12 baitų (antraštė) + 1 baitas (reikšmė) + 3 baitai (lygiavimas) = apie 16 baitų.
  • Node mazgo dydis: 12 baitų (antraštė) + 4 baitai (nuoroda item) + 4 baitai (nuoroda next) + 4 baitai (nuoroda prev) + 4 baitai (lygiavimas) = apie 28 baitus.
  • Bendra dydis: apie 44 baitus.

Tipinis įvertinimas (64-bit JVM su suspaustomis nuorodomis - pagal numatytuosius nustatymus mažesniems nei 32 GB atminties):

  • Byte objekto dydis: 12 baitų (antraštė) + 1 baitas (reikšmė) + 3 baitai (lygiavimas) = apie 16 baitų.
  • Node mazgo dydis: 12 baitų (antraštė) + 4 baitai (nuoroda item) + 4 baitai (nuoroda next) + 4 baitai (nuoroda prev) + 0 baitų (lygiavimas, jei laukai jau lygiuojami iki 8 baitų) = apie 24 baitus.
  • Bendra dydis: apie 40 baitų.

Didžiausias įvertinimas (64-bit JVM be suspaustomis nuorodomis):

  • Byte objekto dydis: 12 baitų (antraštė) + 1 baitas (reikšmė) + 3 baitai (lygiavimas) = apie 16 baitų.
  • Node mazgo dydis: 12 baitų (antraštė) + 8 baitai (nuoroda item) + 8 baitai (nuoroda next) + 8 baitai (nuoroda prev) + 4 baitai (lygiavimas) = apie 40 baitų.
  • Bendra dydis: apie 56 baitus.

Taigi, atsižvelgiant į visus šiuos veiksnius, atminties įvertis saugoti vieną byte primityvą LinkedList<Byte> yra apie 40-60 baitų, dėl papildomų objekto apvalkalo Byte ir LinkedList.Node mazgo išlaidų. Tai žymiai daugiau nei 1 baitas paties primityvo.