Estructura de objeto JVM

 

máquina virtual HotSpot, los objetos almacenados en la disposición de memoria se puede dividir en tres áreas: cabecera del objeto (Header), datos de instancia (instancia de datos) y el acolchado de alineación (el relleno)
 
1. Encabezado de objeto
El encabezado de objeto de la máquina virtual HotSpot incluye dos partes de información,
(1) una primera porción MarkWord : para almacenar datos de tiempo de ejecución objeto en sí mismo, tal como un código hash (HashCode), la generacional Edad GC , bandera del estado de bloqueo , las cerraduras de rosca a cabo , desviando el ID del hilo , el sesgo de marca de tiempo como, La longitud de esta parte de los datos es de 32 y 64 bits en las máquinas virtuales de 32 y 64 bits (sin considerar el escenario de activar el puntero comprimido), que oficialmente se llama "Mark Word".
Cuando se carga una clase, el hashCode se almacena en Mark Word en el encabezado del objeto.
 
(2) una primera porción KlassWord , es decir, el tipo de puntero , es decir, los metadatos puntero de objeto a su clase, una máquina virtual se determina por el puntero, que es una instancia de la clase de objeto. No todas las implementaciones de máquinas virtuales deben retener punteros de tipo en los datos del objeto. En otras palabras, encontrar información de metadatos para un objeto no necesariamente pasa por el objeto en sí. Además, si el objeto es una matriz Java, debe haber una pieza de datos utilizada para registrar la longitud de la matriz en el encabezado del objeto, porque la máquina virtual puede determinar el tamaño del objeto Java a través de la información de metadatos del objeto Java ordinario, pero a partir de los metadatos de la matriz El tamaño de la matriz no se puede determinar. 
 

 

 

2. Datos de instancia
La parte de datos de instancia es la información efectiva que el objeto realmente almacena, y también es el contenido de varios tipos de campos definidos en el código del programa. Ya sea que se herede de la clase principal o se defina en la clase secundaria, debe registrarse.
 
3. Alinear el relleno
La tercera parte del relleno de alineación no existe necesariamente y no tiene un significado especial, solo sirve como marcador de posición. Dado que el sistema de administración automática de memoria de HotSpot VM requiere que la dirección de inicio del objeto sea un múltiplo entero de 8 bytes, en otras palabras, el tamaño del objeto debe ser un múltiplo entero de 8 bytes. La parte del encabezado del objeto es exactamente un múltiplo de 8 bytes (1x o 2x), por lo que cuando la parte de datos de la instancia del objeto no está alineada, debe completarse con un relleno de alineación.

 

Leyendas para objetos comunes y tipos de matriz

  • La palabra de marca en el encabezado del objeto se usa principalmente para indicar el estado de bloqueo del hilo del objeto, y también se puede usar para cooperar con el GC y almacenar el código hash del objeto;
  • Klass Word es un puntero a la información de Clase en el área del método, lo que significa que el objeto siempre puede saber qué instancia de Clase es;
  • La longitud de la matriz también ocupa 64 bits (8 bytes) de espacio, que es opcional, solo cuando el objeto sea una matriz tendrá esta parte;
  • El cuerpo del objeto es la parte principal utilizada para guardar los atributos y valores del objeto, y el espacio de memoria ocupado depende del número y tipo de los atributos del objeto;
  • La palabra de alineación es reducir el espacio de fragmentación de la memoria de almacenamiento dinámico (no necesariamente precisa).
 
Todos los objetos heredan de la clase oopDesc:
class oopDesc ​​{
     private :
         volatile markOop _mark; // Información de tiempo de ejecución del objeto, como código hash , antigüedad de GC, bloqueo, etc. 
        union _metaData {         // Puntero de metadatos del objeto, apuntando al objeto klass que describe el objeto 
            wideKlassOop _klass; 
            narrowOop _compressed_klass; 
        } _metaData ; 
    ...... 
}

Cada vez que se llama a new para crear un nuevo objeto, asignará memoria en el montón y creará una instancia de objeto que contiene el encabezado del objeto y los datos de la instancia, y luego devolverá la referencia del resultado creado a una variable local en la pila de Java. A través del encabezado del objeto, puede acceder a la información de tiempo de ejecución del objeto (_mark) y a la información relacionada con el tipo de objeto (_metaData pointer).

 

El acceso a objetos en HotSpot se implementa mediante punteros directos, como se muestra en la siguiente figura: 

Los programas Java operan en objetos específicos en el montón por referencia en la pila Java:  
1) Cuando desee acceder a los datos de la instancia, es decir, los atributos generales de la clase, puede acceder directamente a los datos de la instancia de los objetos en el montón a través de la referencia  
2) Cuando desee acceder al método y a las propiedades estáticas del objeto, puede acceder al objeto klass en el área del método a través del puntero _metaData  
3) Dado que el objeto klass contiene la tabla de funciones virtuales vtbl, cada objeto puede encontrar todas las funciones virtuales accediendo al objeto klass a través del puntero _metaData  
4) klass contiene _super, _subclass y otra información, para que pueda encontrar toda la clase principal, clase secundaria, clase secundaria, etc. de cada clase

 

 

Supongo que te gusta

Origin www.cnblogs.com/caoxb/p/12735567.html
Recomendado
Clasificación