2013-11-04 38 views
9

Ho un oggetto in Java che contiene una stringa. Sono curioso di sapere come funziona l'uso della memoria di una stringa. Sto cercando di ottimizzare l'utilizzo della memoria per il mio programma e l'applicazione avrà circa 10000 tali oggetti. Per una stringa come "Hello World", quale sarebbe l'utilizzo della memoria?Utilizzo della memoria di String in Java

+2

http://stackoverflow.com/questions/9699071/what-is-the-javas-internal-represention-for-string-modified-utf-8-utf-16 – jdevelop

+0

L'utilizzo della memoria per "Hello World" è probabilmente 11 o 22 byte, a seconda della codifica. Tuttavia, se la stessa stringa è presente in più punti, potrebbe essere lo stesso oggetto e si spende solo la memoria per il riferimento. – Cruncher

+1

@Cruncher: non esiste "in base alla codifica" in Java. Internamente tutti gli oggetti Java String sono memorizzati come UTF-16 (o qualche versione di quello). –

risposta

9

Java utilizza due byte per carattere *, quindi è necessario moltiplicare il numero di caratteri per due per ottenere un'approssimazione approssimativa. Oltre all'archiviazione del "payload", dovresti tenere conto dello spazio allocato al riferimento alla tua stringa, che di solito è uguale alla dimensione di un puntatore sulla tua architettura di destinazione, lo spazio per la lunghezza della stringa, che è un int e lo spazio per il codice hash memorizzato nella cache, che è un altro int.

Poiché, "Hello World" è lungo 11 caratteri, lo stimerei come 2 * 11 + 4 + 4 + 4 = 34 byte su computer con puntatori a 32 bit o 2 * 11 + 8 + 4 + 4 = 38 byte su computer con puntatori a 64 bit.

Nota: questa stima non considera gli effetti delle costanti di stringa interne. Quando una stringa è interned, tutti i riferimenti alla stringa internata condividono lo stesso carico utile, quindi la memoria aggiuntiva per istanza aggiuntiva di una stringa internata è la dimensione di un riferimento (ovvero la dimensione del puntatore sull'architettura di destinazione).


* A meno che non sia utilizzata l'opzione -XX:+UseCompressedStrings, nel qual caso le stringhe che non richiedono UTF-16 utilizzano la codifica UTF-8.

+4

Non dimenticare le stringhe interne (String.intern) e il pool per loro. Posso dichiarare 'String s =" Ciao. ";' In ogni classe, ma sarà condiviso tra tutte le istanze, quindi non è X istanze volte s.length(). È approssimativamente 4 + istanze di dimensione puntatore di istanza *. – MadConan

+0

@MadConan Questa è una bella osservazione, grazie per il commento! – dasblinkenlight