Middle+
Mekkora a becsült memóriaigény egy byte típusú primitív tárolására egy LinkedList adatstruktúrában?
sobes.tech MI
Válasz az MI-től
Memória becslés egy byte primitív tárolására LinkedList<Byte>-ben:
- Primitive
byte: önmagában 1 byte helyet foglal. - Wrapper objektum
Byte: aLinkedList-ben objektumokat tárolnak, nem primitíveket. Abyteautomatikusan csomagolódik egyByteobjektumba. AByteobjektum tartalmaz:- Objektum metaadatok (fejléc): általában 8 vagy 12 byte (a JVM-től függően).
valuemező: 1 byte (abytetípusú értékhez).- Igazítás: az objektumokat gyakran igazítják a gép szavának méretéhez (4 vagy 8 byte). Ha a fejléc 12 byte + érték 1 byte = 13 byte, akkor valószínűleg 16 byte-ra lesz igazítva.
LinkedList.Nodecsomópont: minden elem aLinkedList-ben egy belsőNodeosztály példányába van csomagolva. Ez a csomópont tartalmaz:- Objektum metaadatok (fejléc): 8 vagy 12 byte.
itemmező: referencia a tárolt objektumra (ebben az esetben egyByteobjektum). A referencia általában 4 vagy 8 byte (a JVM 32 vagy 64 bites változatától és a tömörített pointerek használatától függően).nextmező: referencia a következő csomópontra. 4 vagy 8 byte.prevmező: referencia az előző csomópontra. 4 vagy 8 byte.- Igazítás: a mezők és a fejléc összmérete is igazodik.
Minimális becslés (32 bites JVM, tömörített pointerek nélkül):
Byteobjektum: 12 byte (fejléc) + 1 byte (érték) + 3 byte (igazítás) = kb. 16 byte.Node: 12 byte (fejléc) + 4 byte (itemreferencia) + 4 byte (nextreferencia) + 4 byte (prevreferencia) + 4 byte (igazítás) = kb. 28 byte.- Teljes méret: kb. 16 + 28 = kb. 44 byte.
Tipikus becslés (64 bites JVM, tömörített pointerekkel - alapértelmezett a 32GB alatti heap esetén):
Byteobjektum: 12 byte (fejléc) + 1 byte (érték) + 3 byte (igazítás) = kb. 16 byte.Node: 12 byte (fejléc) + 4 byte (itemreferencia) + 4 byte (nextreferencia) + 4 byte (prevreferencia) + 0 byte (igazítás, ha a mezők már 8 byte-alig vannak igazítva) = kb. 24 byte.- Teljes méret: kb. 16 + 24 = kb. 40 byte.
Maximális becslés (64 bites JVM, tömörített pointerek nélkül):
Byteobjektum: 12 byte (fejléc) + 1 byte (érték) + 3 byte (igazítás) = kb. 16 byte.Node: 12 byte (fejléc) + 8 byte (itemreferencia) + 8 byte (nextreferencia) + 8 byte (prevreferencia) + 4 byte (igazítás) = kb. 40 byte (vagy 36+4).- Teljes méret: kb. 16 + 40 = kb. 56 byte.
Így a memóriabecslés egy byte primitív típus tárolására LinkedList<Byte>-ben kb. 40-60 byte, a Byte wrapper objektum és a LinkedList.Node csomópont többletköltsége miatt. Ez sokkal több, mint a primitív 1 byte.