2009-04-08 13 views
12

¿Cuál es la sobrecarga de memoria de una función en una clase?¿Cuál es la sobrecarga de memoria de un método Java?

Por ejemplo,

Class A 
{ 
int a 
} 

Class B 
{ 
int a 
int foo(int); 
} 

Así 100 instancias de la clase A debería ser de 80 bytes. ¿Qué pasa con 100 instancias de clase B?

+1

No se llama función. Se llama un método. – eleven81

+0

jajaja, sí, se llama método, y sería mejor que hicieras una prueba. –

+2

no es comprobable, excepto mirando la fuente de la VM, a menos que haga lo que otros están haciendo y suponga que la forma serializada es la misma que en la forma de memoria. – TofuBeer

Respuesta

-1

Probablemente sizeof el puntero tabla v redondeado hasta un múltiplo de 16.

+0

Las clases de ambos objetos tendrán algún tipo de referencia a su clase. –

+0

Sí, el puntero a la tabla de funciones virtuales. – tpdi

1

El método no se almacena en la forma serializada. Es tan simple como eso.

Edit: En cuanto a los objetos en la máquina virtual durante la ejecución, el tamaño debe ser constante, independientemente de cuántos métodos tiene la clase del objeto.

4

80 bytes ya que un método no está incluido en el objeto. A menos que también esté hablando sobre el tipo de cosa "vtable", en cuyo caso probablemente 160 bytes.

Aclaración en los 160 bytes. El 160 sería si cada objeto asignó su propio vtable (que es una implementación posible). Alternativamente (y como se señala en los comentarios) una mejor manera sería un vtable por clase, lo que significaría 80 + el tamaño del puntero al vtable (probablemente 4 u 8 bytes dependiendo de la VM). Entonces 84 u 88 bytes.

Todo esto depende totalmente de la forma en que la VM asigna memoria y trata con métodos no finales. Sin saber cómo se implementa la máquina virtual en particular, ninguna de las preguntas puede responderse correctamente.

+0

Ambas clases tienen algún tipo de referencia a su clase (un equivalente a un puntero vtbl de C++). No es como si cada objeto llevara mucha información de clase en cualquier clase de VM razonable. –

+0

Esa es una implementación específica de VM, ya que es una implicación específica del compilador de C++. – TofuBeer

+0

Tom, pareces estar demasiado centrado en la implementación de Sun cuando comentas mis respuestas. Si no puedes molestarte pensando que hay otras posibles implementaciones de VM, bueno, no sé qué decir. – TofuBeer

1

Igual, 80! (en resumen)

2

Como algunas otras personas al menos han dicho, el método no se almacena en la serialización.

Puede hacer fácilmente una prueba para mostrar esto en este ejemplo con el siguiente código.

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 


public class SerializationTest { 

    public static void main(String[] args) { 
     serialize(true); 
     serialize(false); 
    } 

    public static void serialize(boolean aOrB) { 
     FileOutputStream fos = null; 
     ObjectOutputStream out = null; 
     try { 
      fos = new FileOutputStream("output.txt"); 
      out = new ObjectOutputStream(fos); 
      out.writeObject(aOrB ? new A() : new B()); 
      out.close(); 
      fos.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     File file = new File("output.txt"); 
     System.out.println(file.length()); 
    } 

    public static class A implements Serializable { 
     int a = 0; 
    } 

    public static class B implements Serializable { 
     int a = 0; 

     public int foo(int a) { 
      return a; 
     } 
    } 
} 

Para mí esto imprime

48 
48 
+4

La serialización no necesariamente refleja la forma en que se asignan los datos dentro de una máquina virtual en ejecución. – TofuBeer

11

La sobrecarga es ... nada.

La definición del método y la dirección del código se almacenan en el objeto Class, que tiene una instancia única hacia la cual apunta cada instancia de su objeto. Dado que ese sería el caso, ya sea que haya agregado ese método o no, la sobrecarga para cada objeto individual no es nada.

+3

Y no entiendo el voto hacia abajo, ya que la respuesta es exacta. – Varkhan

+0

Yo no, pero esta respuesta no es exactamente correcta. Hay una sobrecarga en el mantenimiento de las definiciones de métodos, incluso si la sobrecarga es fija y no depende del número de instancias. ¿Podemos tener un millón de métodos? Si no, entonces la sobrecarga existe. – Pacerier

2

Los objetos de ambas clases utilizarán unos 20-24 bytes para las JVM de 32/64 bits.

Cuestiones relacionadas