2012-09-03 14 views
9

Tengo que almacenar millones de pares dobles X/Y para referencia en mi programa Java. Me gustaría mantener el consumo de memoria lo más bajo posible, así como el número de referencias de objetos. Así que después de pensar un poco decidí que sostiene los dos puntos en una pequeña matriz doble podría ser una buena idea, es la configuración sea como así:¿Clase de Java frente al tamaño de la memoria de la matriz?

double[] node = new double[2]; 
node[0] = x; 
node[1] = y; 

que pensé utilizando la matriz impediría que la relación entre la clase y mi X y variables Y utilizan en una clase, de la siguiente manera:

class Node { 
    public double x, y; 
} 

sin embargo, después de leer en el modo en que se almacenan los campos públicos en clases, me di cuenta de que los campos no pueden en realidad ser estructurados como puntero como las estructuras, tal vez la JVM se simplemente almacenando estos valores en la memoria contigua y sabe cómo encontrarlos sin una dirección, haciendo así la representación de clase de mi punto más pequeño que el conjunto.

Entonces, la pregunta es, ¿qué tiene una huella de memoria más pequeña? ¿Y por qué?

Estoy particularmente interesado en si los campos de clase usan o no un puntero y, por lo tanto, tienen una sobrecarga de 32 bits o no.

Respuesta

5

Este último tiene la huella más pequeña.

Los tipos primitivos se almacenan en línea en la clase contenedora. Por lo tanto, su Node requiere un encabezado de objeto y dos ranuras de 64 bits. La matriz que especifique utiliza un encabezado de matriz (> = un encabezado de objeto) en lugar de dos ranuras de 64 bits.

Si va a asignar 100 variables de esta manera, entonces no importa tanto, ya que son solo los tamaños de encabezado los que son diferentes.

Advertencia: todo esto es algo especulativo ya que no especificó la JVM: algunos de estos detalles pueden variar según la JVM.

+0

Actualmente ejecuto Java 1.7 SE en x64 en Mac OS X. Ahora supongo que una matriz 2D gigante eliminaría por completo la referencia de objeto necesaria para cada Nodo, ¿sería la forma más conservadora de memoria para llevar? –

+0

si en 2D quiere decir double [2] [n] o double [n] [2], eso también generará referencias a objetos. ya que las matrices en java son verdaderamente matrices de matrices en este caso –

+0

(Usted está * camino * sobreimpulsando esto, pero ...) La menor huella de memoria sería una matriz 1-D donde se calculan los índices explícitamente. Las matrices 2D en Java son solo una matriz de punteros a arrays 1D. –

0

No creo que su mayor problema sea almacenar los datos, creo que será recuperarlos, indexarlos y manipularlos.

Sin embargo, una matriz, fundamentalmente, es el camino a seguir. Si desea guardar punteros, use una matriz unidimensional. (Alguien ya ha dicho eso).

0

En primer lugar, debe indicarse que el uso de espacio real depende de la JVM que esté utilizando. Es estrictamente específico de implementación. Lo siguiente es para una JVM convencional típica.

Entonces, la pregunta es, ¿qué tiene una huella de memoria más pequeña? ¿Y por qué?

La segunda versión es más pequeña. Una matriz tiene la sobrecarga del campo de 32 bits en el encabezado del objeto que contiene la longitud de la matriz. En el caso de un objeto que no sea de matriz, el tamaño está implícito en la clase y no necesita representarse por separado.

Pero tenga en cuenta que se trata de una cabeza sobre por objeto de matriz. Cuanto más grande es la matriz, menos importante es la sobrecarga en términos prácticos. Y el otro lado del uso de una clase en lugar de una matriz es que la indexación no funcionará y, como resultado, su código puede ser más complicado (y más lento).

Una matriz 2D de Java es en realidad una matriz de matrices 1D (etcétera), por lo que puede aplicar el mismo análisis a las matrices con una mayor dimensionalidad.Cuanto mayor sea el tamaño de una matriz en cualquier dimensión, menor será el impacto que tenga la sobrecarga. La sobrecarga en una matriz 2x10 será menor que en una matriz 10x2. (Creo que a través de ... 1 matriz de longitud 2 + 2 de longitud 10 frente 1 matriz de longitud 10 + 10 de longitud 2. La sobrecarga es proporcional al número de arrays.)

I' m particularmente interesado en si los campos de clase usan o no un puntero y, por lo tanto, tienen una sobrecarga de 32 bits o no.

(en realidad se está hablando de campos de instancia, no campos de clase. Estos campos no son static ...)

campos cuyo tipo es un tipo primitivo se almacenan directamente en el nodo montón del objeto sin cualquier referencia No hay punteros en este caso.

Sin embargo, si los tipos de campo eran tipos de envoltura (por ejemplo Double en lugar de double) entonces podría haber la sobrecarga de una referencia y los gastos generales de la cabecera de objeto para el objeto Double.

+0

Eso aclara mi pregunta original muy bien, ¡gracias! –

Cuestiones relacionadas