Como ya sabrá, una vez que se crea un objeto, es solo una serie de bytes en el montón. Es posible que sienta curiosidad por saber cómo se ven exactamente los objetos Java en la memoria.
1. Campos
A continuación se muestra un ejemplo de un diseño de objeto para la clase «Base» (B). Esta clase no tiene ningún método. Veremos cómo se establecen los métodos en la memoria más adelante en la publicación.
Si tenemos otra clase «Derivado» (D) ampliando esta clase «Base». El diseño de la memoria se vería así:
El objeto secundario tiene el mismo diseño de memoria que los objetos principales, excepto que necesita más espacio para colocar los campos recién agregados. El beneficio de este diseño es que un puntero de tipo B que apunta a un objeto D todavía ve el objeto B al principio. Por lo tanto, las operaciones realizadas en un objeto D a través de la referencia B garantizan que sean seguras, y no hay necesidad de verificar a qué apunta B dinámicamente.
2. Métodos
Siguiendo la misma lógica, el método se puede poner al principio de los objetos.
Sin embargo, este enfoque no es eficaz. Si una clase tiene muchos métodos (por ejemplo, M), entonces cada objeto debe tener configurados punteros O (M). Además, cada objeto debe tener espacio para punteros O (M). Esos hacen que la creación de objetos sea más lenta y los objetos más grandes.
El enfoque de optimización es crear una tabla de función virtual (o vtable) que es una matriz de punteros a las implementaciones de funciones miembro para una clase en particular. Cree una única instancia de vtable para cada clase y haga que cada objeto almacene un puntero a vtable.
Este es el enfoque optimizado.
* Las anteriores son mis notas para las conferencias de compiladores de Standford que tienen muy buena animación.
Referencias:
1. Conferencias de compiladores de Stanford
2. JVM