Sobes.tech
Middle+

Jaka jest szacunkowa ilość pamięci potrzebnej do przechowywania primitive typu byte w strukturze danych LinkedList?

sobes.tech AI

Odpowiedź od AI

Ocena pamięci dla przechowywania pojedynczego typu byte w LinkedList<Byte>:

  1. Prymityw byte: zajmuje 1 bajt.
  2. Obiekt opakowujący Byte: w LinkedList przechowywane są obiekty, nie prymitywy. byte będzie automatycznie opakowany w obiekt Byte. Obiekt Byte zawiera:
    • Metadane obiektu (nagłówek): zazwyczaj 8 lub 12 bajtów (w zależności od JVM).
    • Pole value: 1 bajt (dla wartości typu byte).
    • Wyrównanie: obiekty często wyrównuje się do rozmiaru słowa maszynowego (4 lub 8 bajtów). Jeśli nagłówek ma 12 bajtów + wartość 1 bajt = 13 bajtów, prawdopodobnie wyrówna się do 16 bajtów.
  3. Węzeł LinkedList.Node: każdy element w LinkedList jest opakowany w instancję klasy wewnętrznej Node. Ten węzeł zawiera:
    • Metadane obiektu (nagłówek): 8 lub 12 bajtów.
    • Pole item: odwołanie do przechowywanego obiektu (w tym przypadku obiektu Byte). Odwołanie zwykle zajmuje 4 lub 8 bajtów (w zależności od JVM 32- lub 64-bitowej i użycia skompresowanych wskaźników).
    • Pole next: odwołanie do następnego węzła. 4 lub 8 bajtów.
    • Pole prev: odwołanie do poprzedniego węzła. 4 lub 8 bajtów.
    • Wyrównanie: łączny rozmiar pól i nagłówka węzła jest również wyrównywany.

Minimalna szacunkowa wartość (JVM 32-bit bez skompresowanych wskaźników):

  • Obiekt Byte: 12 bajtów (nagłówek) + 1 bajt (wartość) + 3 bajty (wyrównanie) = około 16 bajtów.
  • Węzeł Node: 12 bajtów (nagłówek) + 4 bajty (odwołanie item) + 4 bajty (odwołanie next) + 4 bajty (odwołanie prev) + 4 bajty (wyrównanie) = około 28 bajtów.
  • Całkowity rozmiar: około 16 + 28 = około 44 bajtów.

Typowa wartość szacunkowa (JVM 64-bit z skompresowanymi wskaźnikami - domyślnie dla stosu < 32GB):

  • Obiekt Byte: 12 bajtów (nagłówek) + 1 bajt (wartość) + 3 bajty (wyrównanie) = około 16 bajtów.
  • Węzeł Node: 12 bajtów (nagłówek) + 4 bajty (odwołanie item) + 4 bajty (odwołanie next) + 4 bajty (odwołanie prev) + 0 bajtów (wyrównanie, jeśli pola są już wyrównane do 8 bajtów) = około 24 bajtów.
  • Całkowity rozmiar: około 16 + 24 = około 40 bajtów.

Maksymalna wartość szacunkowa (JVM 64-bit bez skompresowanych wskaźników):

  • Obiekt Byte: 12 bajtów (nagłówek) + 1 bajt (wartość) + 3 bajty (wyrównanie) = około 16 bajtów.
  • Węzeł Node: 12 bajtów (nagłówek) + 8 bajtów (odwołanie item) + 8 bajtów (odwołanie next) + 8 bajtów (odwołanie prev) + 4 bajty (wyrównanie) = około 40 bajtów (lub 36+4).
  • Całkowity rozmiar: około 16 + 40 = około 56 bajtów.

W związku z tym, szacunkowa pamięć do przechowywania jednego prymitywu typu byte w LinkedList<Byte> wynosi około 40-60 bajtów ze względu na narzuty związane z obiektem opakowującym Byte i węzłem LinkedList.Node. To znacznie więcej niż 1 bajt samego prymitywu.