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>:
- Primitivas
byte: užima 1 baitą. - Objekto apvalkalas
Byte:LinkedListsaugo objektus, o ne primityvus.byteautomatiškai įpakavimas įByteobjektą.Byteobjektas apima:- Objekto metadatas (antraštė): paprastai 8 arba 12 baitų (priklauso nuo JVM).
- Laukas
value: 1 baitas (bytetipo 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ų.
LinkedList.Nodemazgas: Kiekvienas elementasLinkedListyra apgaubtas vidiniameNodeklasės objekte. Šis mazgas turi:- Objekto metadatas (antraštė): 8 arba 12 baitų.
- Laukas
item: nuoroda į saugomą objektą (šiuo atveju,Byteobjektą). 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ų):
Byteobjekto dydis: 12 baitų (antraštė) + 1 baitas (reikšmė) + 3 baitai (lygiavimas) = apie 16 baitų.Nodemazgo dydis: 12 baitų (antraštė) + 4 baitai (nuorodaitem) + 4 baitai (nuorodanext) + 4 baitai (nuorodaprev) + 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):
Byteobjekto dydis: 12 baitų (antraštė) + 1 baitas (reikšmė) + 3 baitai (lygiavimas) = apie 16 baitų.Nodemazgo dydis: 12 baitų (antraštė) + 4 baitai (nuorodaitem) + 4 baitai (nuorodanext) + 4 baitai (nuorodaprev) + 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):
Byteobjekto dydis: 12 baitų (antraštė) + 1 baitas (reikšmė) + 3 baitai (lygiavimas) = apie 16 baitų.Nodemazgo dydis: 12 baitų (antraštė) + 8 baitai (nuorodaitem) + 8 baitai (nuorodanext) + 8 baitai (nuorodaprev) + 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.