Pregunta

Me gustaría preguntar acerca de sobrecarga de memoria en Java, Tengo una gran ArrayList (61,770 artículos), y tratando de calcular la cantidad de memoria ocupada por cada elemento (contando el objeto y su entrada ArrayList), perfilando la aplicación me sale que, después de cargar todos los datos, el montón tarda unos 25 Mb. cuando el ArrayList tiene sólo 2 artículos del montón lleva ~ 1 MB, de modo más o menos:

(24 * 1024 * 1024) / 61,768 = 407 bytes.

sin embargo , cuando cuente los campos de la cada objeto, consigo 148 bytes (no incluyendo el ArrayList, y suponiendo int = 4, float = 4, la referencia = 4), tengo curiosidad saber donde hizo todos esos bytes adicionales vinieron de ...

Puedo adivinar que, dado que los objetos que lo guarde en el ArrayList están implementando una interfaz, que almacenan valores extra, tal vez las tiendas VM un puntero de función 4byte para cada método implementado? la interfaz que implementan tienen 20 funciones así que eso es 80 bytes más, un total de 228 bytes, todavía no está cerca de los 400 bytes medido.

cualquier ayuda sería apreciada.


wow, gracias por todas las grandes respuestas.

@Bolo:. Gracias por el enlace, con esta clase mido ~ 350 bytes por objeto, de manera que pueda por lo menos confirmar el origen del uso de la memoria grande

A @Yuval: gracias por esa presentación, una valiosa fuente de información

.

@Ukko:. Punto señalado

@Jayan:. NetBeans Profiler ahora me está dando errores cuando trato de volcar el montón, tratará más adelante otra vez

¿Fue útil?

Solución

Estos resultados no son sorprendentes. La JVM añade enormes cantidades de sobrecarga a cada objeto.

Sobre el doble del tamaño esperado para un solo objeto, debido a la sobrecarga de la memoria JVM, no es infrecuente.

Esta presentación tiene un maravilloso, en profundidad, explicación y descripción general de uso de memoria diferentes estructuras de datos en Java.

Otros consejos

Un ArrayList ist su mayoría más grande que el número de elementos. Uso getCapacity() para obtener el tamaño actual de la matriz subyacente.

Un gran problema con su enfoque es la interacción con el recolector de basura. Básicamente hace que cualquier prueba como usted ha propuesto totalmente opaco desde el exterior.

Como un experimento mental si se quería hacer esto usted debe

  1. fuego de su JVM y hacer un par de GC globales para obtener toda la basura fuera
  2. Medir el tamaño de la pila y la noción de la cantidad de espacio libre que tiene de Java.
  3. Ejecutar la prueba
  4. GC un par de veces
  5. Rehacer las mediciones desde el Paso # 2

Después de todo eso y un poco de matemáticas que estará más cerca, pero todavía no está bien. La única solución real es preguntar en realidad la aplicación al igual que otras personas han mencionado. O la figura hacia fuera a partir del conocimiento de la aplicación.

memoria consumida por ArrayList es un poco vago.

Tome un volcado de pila del proceso en la etapa apropiada - después de los valores están totalmente asignados. A continuación, utilice herramientas como analizador de memoria (de Eclipse).

la siguiente dirección encontrará poco profunda y retenido montón tamaños.

Como nota al margen, ya que usted sabe exactamente cuántos objetos serán en su ArrayList, ¿por qué no utilizar una matriz []? Será el número de objetos en cambio hay?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top