Sobes.tech
Middle+

Wie hoch ist die geschätzte Menge an Speicher, die benötigt wird, um ein Primitive vom Typ Byte in einer LinkedList-Datenstruktur zu speichern?

sobes.tech KI

Antwort von AI

Speicherbewertung für die Speicherung eines primitiven byte in LinkedList<Byte>:

  1. Primitive byte: benötigt 1 Byte für sich selbst.
  2. Wrapper-Objekt Byte: in LinkedList werden Objekte gespeichert, keine Primitives. byte wird automatisch in ein Byte-Objekt verpackt. Das Byte-Objekt enthält:
    • Objektdaten (Header): normalerweise 8 oder 12 Bytes (abhängig von der JVM).
    • Feld value: 1 Byte (für den Wert des byte).
    • Ausrichtung: Objekte werden oft auf die Wortgröße der Maschine ausgerichtet (4 oder 8 Bytes). Wenn der Header 12 Bytes + Wert 1 Byte = 13 Bytes sind, wird wahrscheinlich auf 16 Bytes ausgerichtet.
  3. Knoten LinkedList.Node: jedes Element in LinkedList ist in eine Instanz der inneren Klasse Node eingepackt. Dieser Knoten enthält:
    • Objektdaten (Header): 8 oder 12 Bytes.
    • Feld item: Referenz auf das gespeicherte Objekt (in diesem Fall ein Byte-Objekt). Die Referenz benötigt normalerweise 4 oder 8 Bytes (je nach JVM 32- oder 64-Bit und Verwendung von komprimierten Zeigern).
    • Feld next: Referenz auf den nächsten Knoten. 4 oder 8 Bytes.
    • Feld prev: Referenz auf den vorherigen Knoten. 4 oder 8 Bytes.
    • Ausrichtung: die Gesamtlänge der Felder und des Headers des Knotens wird ebenfalls ausgerichtet.

Minimale Schätzung (32-Bit-JVM ohne komprimierte Zeiger):

  • Byte-Objekt: 12 Bytes (Header) + 1 Byte (Wert) + 3 Bytes (Ausrichtung) = ca. 16 Bytes.
  • Node: 12 Bytes (Header) + 4 Bytes (Referenz item) + 4 Bytes (Referenz next) + 4 Bytes (Referenz prev) + 4 Bytes (Ausrichtung) = ca. 28 Bytes.
  • Gesamte Größe: ca. 16 (Byte) + ca. 28 (Node) = ca. 44 Bytes.

Typische Schätzung (64-Bit-JVM mit komprimierten Zeigern - standardmäßig für Heap < 32GB):

  • Byte-Objekt: 12 Bytes (Header) + 1 Byte (Wert) + 3 Bytes (Ausrichtung) = ca. 16 Bytes.
  • Node: 12 Bytes (Header) + 4 Bytes (Referenz item) + 4 Bytes (Referenz next) + 4 Bytes (Referenz prev) + 0 Bytes (Ausrichtung, wenn die Felder bereits auf 8 Bytes ausgerichtet sind) = ca. 24 Bytes.
  • Gesamte Größe: ca. 16 (Byte) + ca. 24 (Node) = ca. 40 Bytes.

Maximale Schätzung (64-Bit-JVM ohne komprimierte Zeiger):

  • Byte-Objekt: 12 Bytes (Header) + 1 Byte (Wert) + 3 Bytes (Ausrichtung) = ca. 16 Bytes.
  • Node: 12 Bytes (Header) + 8 Bytes (Referenz item) + 8 Bytes (Referenz next) + 8 Bytes (Referenz prev) + 4 Bytes (Ausrichtung) = ca. 40 Bytes (oder 36+4).
  • Gesamte Größe: ca. 16 (Byte) + ca. 40 (Node) = ca. 56 Bytes.

Daher beträgt die Speicherabschätzung für die Speicherung eines byte-Primitives in LinkedList<Byte> ungefähr 40-60 Bytes aufgrund der Overheads für das Byte-Wrapper-Objekt und den LinkedList.Node. Das ist deutlich mehr als 1 Byte des Primitives selbst.