Middle+
Каква е оценката за количеството памет, необходимо за съхранение на един примитив от тип byte в структурата от данни LinkedList?
sobes.tech AI
Отговор от AI
Оценка на памет за съхранение на един примитив byte в LinkedList<Byte>:
- Примитив
byte: Зает 1 байт сам по себе. - Обектна обвивка
Byte: ВLinkedListсе съхраняват обекти, а не примитиви.byteще бъде автоматично опакован в обектByte. ОбектътByteсъдържа:- Метаданни на обекта (заглавие): Обикновено 8 или 12 байта (зависи от JVM).
- Поле
value: 1 байт (за стойността на типаbyte). - Подравняване: Обектите често се подравняват до размера на машинната дума (4 или 8 байта). Ако заглавието е 12 байта + стойност 1 байт = 13 байта, вероятно ще бъде подравнено до 16 байта.
- Връзка
LinkedList.Node: Всеки елемент вLinkedListе обвит в вътрешен класNode. Този възел съдържа:- Метаданни на обекта (заглавие): 8 или 12 байта.
- Поле
item: Референция към съхранявания обект (в този случай, обектByte). Референцията обикновено заема 4 или 8 байта (зависи от 32- или 64-битова JVM и използването на компресирани указатели). - Поле
next: Референция към следващия възел. 4 или 8 байта. - Поле
prev: Референция към предишния възел. 4 или 8 байта. - Подравняване: Общият размер на полетата и заглавието на възела също се подравнява.
Минимална оценка (JVM 32-бит без компресирани указатели):
- Обект
Byte: 12 байта (заглавие) + 1 байт (стойност) + 3 байта (подравняване) = около 16 байта. - Възел
Node: 12 байта (заглавие) + 4 байта (референцияitem) + 4 байта (референцияnext) + 4 байта (референцияprev) + 4 байта (подравняване) = около 28 байта. - Общ размер: около 44 байта.
Типична оценка (64-бит JVM с компресирани указатели - по подразбиране за купчина < 32GB):
- Обект
Byte: 12 байта (заглавие) + 1 байт (стойност) + 3 байта (подравняване) = около 16 байта. - Възел
Node: 12 байта (заглавие) + 4 байта (референцияitem) + 4 байта (референцияnext) + 4 байта (референцияprev) + 0 байта (подравняване, ако полетата вече са подравнени до 8 байта) = около 24 байта. - Общ размер: около 40 байта.
Максимална оценка (64-бит JVM без компресирани указатели):
- Обект
Byte: 12 байта (заглавие) + 1 байт (стойност) + 3 байта (подравняване) = около 16 байта. - Възел
Node: 12 байта (заглавие) + 8 байта (референцияitem) + 8 байта (референцияnext) + 8 байта (референцияprev) + 4 байта (подравняване) = около 40 байта. - Общ размер: около 56 байта.
Следователно, оценката за паметта за съхранение на един примитив byte в LinkedList<Byte> е приблизително 40-60 байта поради разходите за обектната обвивка Byte и възела LinkedList.Node. Това е значително повече от 1 байт на самия примитив.