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>:
- Prymityw
byte: zajmuje 1 bajt. - Obiekt opakowujący
Byte: wLinkedListprzechowywane są obiekty, nie prymitywy.bytebędzie automatycznie opakowany w obiektByte. ObiektBytezawiera:- Metadane obiektu (nagłówek): zazwyczaj 8 lub 12 bajtów (w zależności od JVM).
- Pole
value: 1 bajt (dla wartości typubyte). - 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.
- Węzeł
LinkedList.Node: każdy element wLinkedListjest opakowany w instancję klasy wewnętrznejNode. Ten węzeł zawiera:- Metadane obiektu (nagłówek): 8 lub 12 bajtów.
- Pole
item: odwołanie do przechowywanego obiektu (w tym przypadku obiektuByte). 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łanieitem) + 4 bajty (odwołanienext) + 4 bajty (odwołanieprev) + 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łanieitem) + 4 bajty (odwołanienext) + 4 bajty (odwołanieprev) + 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łanieitem) + 8 bajtów (odwołanienext) + 8 bajtów (odwołanieprev) + 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.