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
risposta
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.
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
@MadConan Questa è una bella osservazione, grazie per il commento! – dasblinkenlight
- 1. Utilizzo della memoria Java BigDecimal?
- 2. Utilizzo della memoria String Python su FreeBSD
- 3. Utilizzo della memoria dell'applicazione Java
- 4. Utilizzo della memoria Java in ereditarietà
- 5. String VS Byte [], utilizzo memoria
- 6. Utilizzo della memoria di thread o processo in Java
- 7. Perché l'utilizzo della memoria String di Java è elevato?
- 8. Utilizzo della memoria in LibGdx
- 9. Utilizzo della memoria limite?
- 10. Utilizzo della memoria di ArangoDB
- 11. c utilizzo della memoria # filo
- 12. Utilizzo della memoria di profilatura in Mathematica
- 13. Differenza di utilizzo della memoria Java tra Linux e Windows
- 14. Storia di utilizzo della memoria Linux
- 15. Utilizzo della memoria dei costruttori in Haskell
- 16. XNA Content.Load() Utilizzo della memoria
- 17. Python utilizzo della memoria multiprocessing
- 18. Utilizzo della larghezza di banda di memoria
- 19. pratico utilizzo della memoria virtuale
- 20. Utilizzo memoria memoria in R
- 21. Limitare la memoria e utilizzo della CPU dell'applicazione Java
- 22. Utilizzo memoria di Playframework
- 23. Utilizzo progressivo della memoria della GPU
- 24. String in Java
- 25. Dimensioni della memoria Java della classe vs della memoria?
- 26. ottimizzazione della dimensione in memoria java
- 27. Utilizzo della memoria con i puntatori
- 28. Utilizzo in memoria residente crescente (RSS) di Java Process
- 29. Utilizzo della dichiarazione predefinita @interface in Java
- 30. allocazione dinamica della memoria Java?
http://stackoverflow.com/questions/9699071/what-is-the-javas-internal-represention-for-string-modified-utf-8-utf-16 – jdevelop
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
@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). –