Sobes.tech
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:

  1. Primitive byte: önmagában 1 byte helyet foglal.
  2. Wrapper objektum Byte: a LinkedList-ben objektumokat tárolnak, nem primitíveket. A byte automatikusan csomagolódik egy Byte objektumba. A Byte objektum tartalmaz:
    • Objektum metaadatok (fejléc): általában 8 vagy 12 byte (a JVM-től függően).
    • value mező: 1 byte (a byte tí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.
  3. LinkedList.Node csomópont: minden elem a LinkedList-ben egy belső Node osztály példányába van csomagolva. Ez a csomópont tartalmaz:
    • Objektum metaadatok (fejléc): 8 vagy 12 byte.
    • item mező: referencia a tárolt objektumra (ebben az esetben egy Byte objektum). 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).
    • next mező: referencia a következő csomópontra. 4 vagy 8 byte.
    • prev mező: 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):

  • Byte objektum: 12 byte (fejléc) + 1 byte (érték) + 3 byte (igazítás) = kb. 16 byte.
  • Node: 12 byte (fejléc) + 4 byte (item referencia) + 4 byte (next referencia) + 4 byte (prev referencia) + 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):

  • Byte objektum: 12 byte (fejléc) + 1 byte (érték) + 3 byte (igazítás) = kb. 16 byte.
  • Node: 12 byte (fejléc) + 4 byte (item referencia) + 4 byte (next referencia) + 4 byte (prev referencia) + 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):

  • Byte objektum: 12 byte (fejléc) + 1 byte (érték) + 3 byte (igazítás) = kb. 16 byte.
  • Node: 12 byte (fejléc) + 8 byte (item referencia) + 8 byte (next referencia) + 8 byte (prev referencia) + 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.