2009-09-18 15 views
13

¿Es correcto suponer que un objeto Java solo ocupa los 8 bytes para la referencia del objeto siempre que todos sus miembros estén configurados en null o la definición de miembros ya agota el espacio en la instancia por algún motivo?¿Cuánta memoria usa un objeto Java cuando todos sus miembros son nulos?

En otras palabras, si tengo una gran colección de objetos que deseo que sean eficientes en cuanto a espacio, ¿puedo contar con dejar los miembros sin usar establecidos en null para reducir la huella de memoria?

Respuesta

17

No, necesita 4 u 8 bytes (dependiendo de si se trata de un sistema de 32 o 64 bits) para cada nulo que está almacenando en un campo. ¿Cómo sabría el objeto que su campo era nulo si no había algo almacenado en algún lugar para decirlo?

+0

Sí, buena pregunta. :) Entonces un campo es equivalente a un puntero C (que también requiere memoria). –

+0

Sí, las variables de los tipos de referencia (clases) son referencias a objetos en el montón, equivalentes a los punteros en C. La memoria se tomaría para el puntero y para el objeto al que apunta. Los tipos primitivos, como int, se almacenan directamente y siempre tienen el mismo tamaño. – Joe

6

No, null también es información y también debe almacenarse.

0

¿Qué pasa con los nombres de clases, objetos y métodos? Como puede llamar, acceder o crear instancias con Java reflect, los nombres también deben almacenarse en algún lugar, ¿no? Pero CMIIW.

Kage

+1

Esos no se almacenan por instancia. – CPerkins

+0

Es cierto. La pregunta original era sobre los costos de espacio de los objetos. Gracias :-). – Kage

1

El objeto hace referencia a sí mismos aún se requerirá algo de memoria, por lo que los únicos ahorro de memoria real será a partir de los objetos del montón que se ha hecho referencia.

Por lo tanto, si usted tiene

MyClass { 
    public Object obj; 
    MyClass(Object o) { obj = o; } 
} 

MyClass a = new MyClass(new HashMap()); 
MyClass b = new MyClass(null); 

los dos objetos a y b a sí mismos tomar la misma cantidad de memoria (ambos sostienen una referencia), pero el objeto obj mencionado por a ocupa memoria en el montón, por lo que esta memoria podría haberse guardado estableciendo la referencia a nulo.

1

Java Language Specification y Java Virtual Machine Specification no dicen nada sobre el tamaño de los objetos de Java en la memoria: deliberadamente no se define, porque depende de la implementación de la JVM. Esto significa que no puede hacer suposiciones sobre la cantidad de memoria que usa un objeto Java en general o cuál es el diseño de memoria de un objeto Java en la memoria.

Como ya han dicho otros: Una referencia (variable) ocupa memoria, si la referencia es null o no. Sus objetos no se reducirán y ocuparán menos memoria cuando configure las variables miembro en null.

0

Cuando un objeto Java tiene todos sus miembros son nulos, entonces consumirá memoria porque También tiene algunos requisitos de memoria adicionales para encabezados, referencias y tareas domésticas.

La memoria de pila utilizado por un objeto de Java incluye memoria

  • para campos primitivos, de acuerdo con su tamaño.

  • memoria para campos de referencia (4 bytes cada uno).

  • encabezado de objeto, que consiste en unos pocos bytes de información de "limpieza".

Objetos en Java también requiere alguna información "limpieza", como la grabación de banderas de clase, de identificación y de estado de un objeto, como si el objeto es actualmente accesible, actualmente bloqueada sincronización etc.

objeto

Java el tamaño del encabezado varía en 32 y 64 bit jvm.

Aunque estos son los principales consumidores de memoria jvm también requiere campos adicionales a veces como para la alineación del código e.t.c.

Esta es la razón por la que cuando su objeto Java tiene todos sus miembros son nulos, consumirá memoria.

Cuestiones relacionadas