2009-12-31 8 views
6

Estoy ejecutando un perfil de NetBeans de una operación recursiva que incluye la creación de una clase con un campo java.lang.String. En la lista de clases, en el volcado del heap de perfil, el número de campos String corresponde al número de clases creadas como se esperaba, sin embargo, también hay un número similar de instancias char[]. Las matrices de caracteres representan casi el 70% del uso de la memoria (!) Mientras que el campo Cadena representa aproximadamente el 7%.¿Por qué el generador de perfiles muestra un gran número de instancias char [] cuando no estoy creando ninguna?

¿Qué está pasando aquí? ¿Y cómo puedo reducir el número de instancias de char[]?

Gracias

Respuesta

13

Eche un vistazo al String source code. El objeto String en sí mismo contiene un código hash almacenado en caché, un recuento del número de caracteres (de nuevo, para fines de optimización), un desplazamiento (ya que un String.substr() apunta a los datos de cadena originales) y matriz de caracteres, que contiene la cadena real datos. Por lo tanto, sus métricas muestran que String consume relativamente poco, pero la mayoría de la memoria es tomada por las matrices de caracteres subyacentes.

2

la clase String en la implementación Java de Sun utiliza un char[] para almacenar los datos de caracteres.

Creo que esto se puede verificar sin mirar el código fuente usando un depurador para mirar el contenido de String, o usando la reflexión para ver las partes internas del objeto String.

Por lo tanto, sería difícil reducir el número de char[] que se están creando, a menos que se reduzca el número de instancias String que se están creando.

1

Las cadenas están respaldadas por matrices de caracteres, por lo que no creo que pueda reducir el número de instancias char [] sin reducir sus cadenas.

¿Has probado eliminar algunas cuerdas para ver si también se caen los carbonizados []?

3

Los arrays de char representan casi el 70% del uso de la memoria (!), Mientras que las cuentas de campo de Cuerda por alrededor de 7%

Esto es sutileza de perfiles de memoria conocido como "retenido tamaño" y "tamaño superficial":

  • tamaño superficial se refiere a la cantidad de memoria ocupada por un objeto, sin incluir ninguno de los objetos que contiene. Básicamente, esto significa campos primitivos.
  • tamaño Retenido es el tamaño superficial más el tamaño de los otros objetos mencionados por el objeto, pero sólo se esos otros objetos que se hace referencia únicamente por este objeto (difícil de explicar, concepto simple).

Cadena es el ejemplo perfecto. Contiene un puñado de campos primitivos, más el char[]. El char[] representa la gran mayoría del uso de memoria. El tamaño superficial de String es muy pequeño, pero su tamaño retenido es mucho mayor, ya que incluye el char[].

El perfilador de NetBeans probablemente le da un tamaño poco profundo, lo que no es una cifra muy útil, pero es fácil de calcular. El tamaño retenido incorporaría el uso de la memoria char[] en el uso de la memoria String, pero el cálculo del tamaño retenido es costoso desde el punto de vista informático, por lo que los perfiladores no lo resolverán hasta que se lo pidan explícitamente.

+1

Creo que te refieres a char [], no byte [] –

+1

Vaya. Muy agradecido. Fijo. – skaffman

Cuestiones relacionadas