2011-08-02 12 views
12

Cuando tengo una clase como esta:¿Los métodos en las instancias de clase ocupan un lugar en la memoria?

class Test { 
    private int _id = 0 ; // 4 bytes 
    private int _age = 0 ; // 4 bytes 
} 

Estoy seguro de que cada instancia de consumirá más de 8 bytes en la memoria debido a los 2 enteros.

¿Pero y los métodos? Si tengo una clase con un millón de métodos y 2 instancias de ella, ¿los métodos ocuparán el doble de lugar en la memoria?

¿Cómo funciona?

Gracias.

Respuesta

19

No. Los métodos ocurren solo una vez en la memoria . No varían por instancia, por lo que no necesitan almacenamiento por instancia.

Un objeto en Java consiste básicamente en un "mantenimiento" de tamaño fijo (un puntero a la información de tipo que incluye el vtable), bits potencialmente relacionados con GC (marca de pensamiento y barrido), información sobre el monitor para la instancia, etc. - y luego los campos.


Esto es un poco de una simplificación. Puede haber varias representaciones, como bytecode, código nativo, etc., pero eso es independientemente de las instancias separadas.

+0

Jon Skeet: la única persona que puede obtener dos votos favorables en 45 segundos. –

7

Tener dos instancias de la misma clase no duplica la cantidad de espacio necesaria para el código del método. Es decir, los métodos residen en un lugar en la memoria y luego cada instancia de la clase tiene un puntero apuntando a ese lugar en la memoria. Esto es porque de lo contrario la memoria se desperdiciará. El código que debe ejecutarse para cada método es el mismo, independientemente de qué instancia de la clase lo llame, por lo que no tendría sentido duplicarlo.

3

Pero para ejecutar los métodos como instance.method(), la copia local del método se realizará en la pila por instancia, donde la instancia estará en el montón.

Cuestiones relacionadas