2010-06-12 8 views
6

Mi pregunta está relacionada con la huella de memoria en Java para la clase sin miembro de datos. Supongamos que en Java tengo una clase que no tiene un miembro de datos y solo contiene métodos. Entonces, si estoy creando una instancia de una clase particular, ¿ocupa la memoria en la memoria primaria, excepto en la memoria de referencia del objeto?¿La clase sin miembro de datos tiene huella de memoria en java?

Respuesta

6

En última instancia, cada objeto Java conoce su clase y tiene una primitiva de sincronización opcionalmente unida (aunque this puede ser sintético). Esas son dos referencias que es difícil hacer una instancia java.lang.Object sin. Todo lo demás deriva de esa clase, por lo que tienes un piso para los costos que resultó ser al menos 8 bytes in Java 1.3.1. Un generador de perfiles le informará los costos actuales si realmente los necesita.

+0

+1 para el enlace muy bueno – Arne

+1

Una JVM moderna contiene los datos del monitor de objetos en bits no utilizados de otros punteros que contiene (por ejemplo, los dos bits inferiores del puntero de clase) – dty

+0

@Danny: Tiene tres bits disponibles; Los administradores de memoria "modernos" se alinean en límites de 8 bytes (cuando no se trabaja con matrices, que son más densas). Y por "moderno" quiero decir * todo * por 10 años o más. –

4

Sí, lo hace, porque como mínimo incluso un objeto "vacío" tiene un puntero a su tipo de información.

+0

Tienes razón. Es por eso que mencioné en cuestión que excepto referencia/puntero de objeto. Entonces, aparte de la referencia/punto, ¿tiene alguna huella de memoria? –

+3

Depende de la implementación de JVM. Es probable que haya algún tipo de mecanismo de sincronización por objeto o marcadores de marcador para el recolector de basura. Mi mejor estimación sería al menos 8 bytes de sobrecarga por objeto en una máquina de 32 bits. –

+1

La tara puede ser de hasta 16 bytes, para una JVM de 32 bits ... según los detalles de implementación de JVM. Los gastos generales incluyen el tamaño del objeto primitivo, el enlace a la clase, la representación del mutex primitivo, la representación del código hash de identidad, los indicadores para la finalización, etc. –

3

Seamos claros. Las referencias a su objeto, por supuesto, tomarán espacio. Pero su objeto también tomará espacio para su puntero "this" (es decir, para que pueda distinguir diferentes instancias) y también para los campos de cualquier superclase, p. Ej. Objeto, y finalmente, cualquier sobrecarga que tengan las estructuras de datos internas del montón.

+0

objetos no necesitan almacenar un puntero "this" (ya que el código debe tener este puntero ya disponible para acceder al objeto ....) – mikera

+0

Sí lo hacen. Necesitan un puntero a lo que en C++ se llamaría tabla de métodos virtuales. – dty

2

memoria evaluación comparativa es difícil debido a diversas fuentes de interferencia (creciente montón, CG), pero es todavía vale la pena intentarlo:

public static void main(String[] args) 
{ 
    final int n = 1000000; 

    final Runtime runtime = Runtime.getRuntime(); 

    final Object[] objects = new Object[n]; 

    final long memory0 = runtime.totalMemory() - runtime.freeMemory(); 

    for (int i = 0; i < objects.length; i++) 
    { 
     objects[i] = new Object(); 
    } 

    final long memory1 = runtime.totalMemory() - runtime.freeMemory(); 

    final long memory = memory1 - memory0; 

    System.out.printf(
     "%s %s\n", 
     System.getProperty("java.vm.name"), 
     System.getProperty("java.vm.version")); 

    System.out.printf("%d %d %.1f\n", n, memory, 1.0 * memory/n); 
} 

Java HotSpot (TM) Server VM 14.3-b01 1000000 8000336 8.0

+0

+1 para una prueba real !! – mikera

Cuestiones relacionadas