2012-09-16 9 views
5

Si escribo esto en Java:¿Se necesitan 3 bytes en Java? cuando: String s = "abc"; Java

String s = "abc"; 

¿Se ocupan de Sólo los 3 bytes en la memoria?
Si es verdadero, ¿cómo encuentra JVM el final del objeto String?
¿Esto toma más bytes en la memoria?

+2

Lea la fuente de la clase 'String'. – SLaks

+0

Si lee la fuente de la clase String, verá que almacena la longitud, que es cómo sabe cuánto tiempo dura la cadena. Por cierto, "abc" usa alrededor de 48 bytes de memoria. –

Respuesta

7

Se tarda más de 3 bytes, para leer en explicación completa de this page

Por razones que exploraremos más adelante, el uso de memoria mínima de una cadena de Java (en el hotspot de Java VM 6) es en general, de la siguiente manera:

Minimum String memory usage (bytes) = 8 * (int) ((((no chars) * 2) + 45)/8) 

O, dicho de otra manera:

  • multiplicar el número de Chara cters de la Cadena por dos;
  • agregar 38;
  • si el resultado no es un múltiplo de 8, redondee al siguiente múltiplo de 8;
  • el resultado es generalmente el número mínimo de bytes ocupados en el montón por la Cadena.

This page desde el mismo sitio web también detalla las formas en que se puede ahorrar memoria el uso de clases diferentes de String

+0

agregar 38? o agregue 45? – Al2O3

+1

Agregar 38. El 45 es para redondear en lugar de hacia abajo. –

1

Cadena mínimo uso de memoria (bytes) = 8 * (int) ((((num de caracteres) * 2) + 45)/8)

+0

en teoría podría ser menor que eso ... si tiene en cuenta las cadenas que comparten matrices de respaldo. –

+0

Eso es algo más, OP está preguntando sobre el uso de memoria y una sola cadena. – awm

2

Respuesta corta: no, no por un plano general. Las cadenas JVM son bien conocidas por ser bastante pesadas; el objeto contiene no solo un puntero a la matriz de caracteres sino también su longitud. Y el almacenamiento interno usa puntos de código UTF-16, por lo que su pregunta podría haber sido "¿requiere 6 bytes?" :-)

Una referencia técnica a la JVM le dará el tamaño exacto de los objetos de cadena. También puede encontrar algunas publicaciones de blog interesantes such as this one y artículos técnicos.

Hay mucho más sobre la cuestión del tamaño exacto de los objetos de cadena. Podemos acceder a la compresión de punteros de objeto, intercepción de cadena, etc. También existe el hecho de que, como las cadenas son inmutables, a menudo compartimos la memoria de cadena, como ocurre cuando se llama al substring, por ejemplo.

Sin embargo, lo que siempre es cierto es: es más de 3 bytes.