2010-06-04 17 views
13

Si tengo:cómo calcular el uso de Java arreglo de memoria

int c[] = new int[10]; 

y

int a[][] = new int[2][3]; 

y en general

una serie n*m*..*j

cómo puedo calcular el uso de la memoria real considerando también las variables de referencia?

+0

¿Hay alguna motivación detrás de obtener el "uso real de la memoria" de esas matrices? – bakkal

Respuesta

14

Si quiere una respuesta precisa, no puede. Al menos no de una manera fácil. This thread explica más.

El problema con las respuestas de Bragaadeesh y Bakkal es que ignoran los gastos generales. Cada matriz también almacena cosas como el número de dimensiones que tiene, cuánto tiempo es y algunas cosas que utiliza el recolector de basura.

Para una estimación simple, debería estar bien utilizando los cálculos de las otras respuestas y agregando 100-200 bytes.

+1

Esta respuesta es correcta. Siempre hay sobrecarga debido a la información del tipo/GC y otras cosas. Además, está el hecho de que Java no tiene una verdadera matriz multidimensional, solo arreglos irregulares, que terminan generando bastante de esa sobrecarga. –

+0

¿cómo se representa en la memoria una matriz multidimensional? – xdevel2000

+0

Eliminé mi respuesta porque no conozco ninguna forma de calcular el tamaño * exacto * inclusive la sobrecarga. – bakkal

1

El int[] o int[][] no es un tipo de datos primitivo. Es un Objeto en Java. Y con un objeto, el tamaño no se puede calcular de inmediato.

+0

¿de dónde viene '+ sizeof (int)'? – bakkal

+0

Una referencia puede no ser de 4 bytes, dependiendo de su plataforma. –

+0

@Matti: De acuerdo. Todo el asunto no es correcto. Déjame editarlo. – bragboy

8

sé que estoy un poco tarde a la fiesta, pero en realidad no es extremadamente difícil de calcular la huella de memoria.

permite echar su primer ejemplo: int c[] = new int[N];

De acuerdo con el modelo de memoria de 64 bits, un int es de 4 bytes, por lo que todos los elementos serán 4 * n bytes de tamaño. Además de eso, Java tiene una sobrecarga de matriz de 24 bytes y también hay 8 bytes para el objeto de matriz real. Entonces eso es un total de 32 + 4 * N bytes.

Para una matriz de 2 dimensiones: int a[][] = new int[N][M];

Es básicamente el mismo sólo que cada elemento de la primera matriz es otra matriz de tamaño M, por lo que en lugar de 4 tenemos 32 + 4 * M, por lo que el tamaño total es 32 + (32 + 4 * M) * N.

Es cierto que una generalización para las dimensiones D es bastante complicada, pero se entiende la idea.

+0

¿De dónde obtienes la sobrecarga de 24 bytes? Supongo que el número es para una máquina virtual específica. –

+0

Esta fue la respuesta que necesitaba. Estoy trabajando en un proyecto en el que voy a necesitar una matriz bastante grande, no quiero dividirla en varias operaciones de disco y necesito saber cuánta memoria consumirán estos objetos. Gracias. –

-1

para el tipo original: tipo de base y el tamaño de Byte

  • boolean 1
  • byte 1
  • Char 1
  • int 4
  • flotador 4
  • largo 8
  • doble 8
  • Inter ger 24 (16 por ejemplo Clase + 4 para int + 4 para la alineación de memoria)

int a [M]: 24 + 4M

(16 para la clase + 4 para guardar tamaño de la matriz + 4 para la alineación de la memoria) + (para el tamaño M del doble, necesitamos 4 * M)

int a [M] [N]: (24 + 4M) + M * (24 + 4N) = 24 + 28M + 4MN ~~~ 4MN

tratan una [M] [N] como el tamaño M de la matriz doble a [N] más una matriz adicional para contener la referencia de todos los M si punto de inicio ze array.

+0

cuando está discutiendo diferentes tipos, podemos tener diferentes tamaños, pero para int, podríamos tener un cálculo (puede haber algún espacio debido a la alineación de la memoria) –

+0

'M =?', La matriz siempre se declara 'int' .. . esta respuesta podría mejorarse – solidsnack

Cuestiones relacionadas