Middle+
Qual è la stima della quantità di memoria necessaria per memorizzare un primitive di tipo byte in una struttura dati LinkedList?
sobes.tech AI
Risposta dell'AI
Valutazione della memoria per memorizzare un primitive byte in LinkedList<Byte>:
- Primitive
byte: occupa 1 byte da solo. - Oggetto wrapper
Byte: inLinkedListvengono memorizzati oggetti, non primitive.byteverrà automaticamente incapsulato in un oggettoByte. L'oggettoBytecontiene:- Metadati dell'oggetto (intestazione): di solito 8 o 12 byte (dipende dalla JVM).
- Campo
value: 1 byte (per il valore del tipobyte). - Allineamento: gli oggetti sono spesso allineati alla dimensione di una parola di macchina (4 o 8 byte). Se l'intestazione è di 12 byte + valore di 1 byte = 13 byte, probabilmente sarà allineato a 16 byte.
- Nodo
LinkedList.Node: ogni elemento inLinkedListè avvolto in un'istanza della classe internaNode. Questo nodo contiene:- Metadati dell'oggetto (intestazione): 8 o 12 byte.
- Campo
item: riferimento all'oggetto memorizzato (in questo caso, un oggettoByte). Il riferimento di solito occupa 4 o 8 byte (a seconda di JVM a 32 o 64 bit e uso di puntatori compressi). - Campo
next: riferimento al nodo successivo. 4 o 8 byte. - Campo
prev: riferimento al nodo precedente. 4 o 8 byte. - Allineamento: la dimensione totale dei campi e dell'intestazione del nodo viene anch'essa allineata.
Stima minima (JVM a 32 bit senza puntatori compressi):
- Oggetto
Byte: 12 byte (intestazione) + 1 byte (valore) + 3 byte (allineamento) = circa 16 byte. - Nodo
Node: 12 byte (intestazione) + 4 byte (riferimentoitem) + 4 byte (riferimentonext) + 4 byte (riferimentoprev) + 4 byte (allineamento) = circa 28 byte. - Dimensione totale: circa 16 (Byte) + circa 28 (Node) = circa 44 byte.
Stima tipica (JVM a 64 bit con puntatori compressi - di default per heap < 32GB):
- Oggetto
Byte: 12 byte (intestazione) + 1 byte (valore) + 3 byte (allineamento) = circa 16 byte. - Nodo
Node: 12 byte (intestazione) + 4 byte (riferimentoitem) + 4 byte (riferimentonext) + 4 byte (riferimentoprev) + 0 byte (allineamento, se i campi sono già allineati a 8 byte) = circa 24 byte. - Dimensione totale: circa 16 (Byte) + circa 24 (Node) = circa 40 byte.
Stima massima (JVM a 64 bit senza puntatori compressi):
- Oggetto
Byte: 12 byte (intestazione) + 1 byte (valore) + 3 byte (allineamento) = circa 16 byte. - Nodo
Node: 12 byte (intestazione) + 8 byte (riferimentoitem) + 8 byte (riferimentonext) + 8 byte (riferimentoprev) + 4 byte (allineamento) = circa 40 byte (o 36+4). - Dimensione totale: circa 16 (Byte) + circa 40 (Node) = circa 56 byte.
Pertanto, la stima della memoria per memorizzare un primitive di tipo byte in LinkedList<Byte> è circa 40-60 byte a causa degli overhead per l'oggetto wrapper Byte e il nodo LinkedList.Node. Questo è molto più grande di 1 byte del primitive stesso.