"Comprensión profunda de la máquina virtual" lectura de la asignación de memoria de notas y objetos

Asignación de memoria de objetos y diseño

  • Crear (nuevo, clonar, reflexión, deserialización)
    • nuevo-> El grupo constante localiza la referencia del símbolo y verifica si la clase representada por la referencia del símbolo está cargada, resuelta e inicializada. Si no, se realiza el proceso de carga de clases.
    • La memoria requerida del objeto se puede determinar completamente después de que se complete la carga de la clase.
    • El método de asignación de memoria de objeto está determinado por si el recolector de basura tiene una función de compresión y clasificación
      • Colisión de puntero: la memoria de almacenamiento dinámico es absolutamente regular, y la memoria utilizada y la memoria libre utilizan el puntero como punto de demarcación. La asignación de memoria solo necesita mover el puntero en consecuencia. Colectores en serie, nuevos y otros con proceso compacto.
      • Lista libre: graba direcciones de memoria libre. Actualice la lista al mismo tiempo cuando asigne memoria. cms es un recopilador basado en el algoritmo Mark-Swap.
    • Seguridad de subprocesos de asignación de memoria de objeto
      • Sincronización al asignar memoria: la máquina virtual adopta el método de reintento de fallas CAS plus
      • Subproceso de asignación local de búfer
        • El montón se asigna previamente a un cierto espacio de memoria del subproceso, y esta parte se usa primero al asignar memoria.
        • Solo cuando TLAB se agota, se sincroniza cuando se redistribuye.
        • Si se usa o no se determina mediante el parámetro -XX: +/- UserTLAB
  • Diseño de la memoria
    • Encabezado de objeto
      • MarkWord
        • Almacene los datos de tiempo de ejecución del objeto en sí, como el código hash, la edad de generación del GC, el estado de bloqueo, el bloqueo retenido por el hilo, la ID de hilo sesgada, la marca de tiempo sesgada
        • 32 bits y 64 bits en máquinas virtuales de 32 bits y 64 bits (sin punteros comprimidos)
        • Estructura de datos no fija, multiplexando el espacio de almacenamiento según el estado del objeto

      • Puntero Klass
        • El objeto apunta a un puntero a sus metadatos de clase, que se utiliza para determinar qué instancia de clase es el objeto
        • No completamente a través del objeto en sí, el identificador del conjunto de identificadores se guarda tanto en los datos de instancia como en los punteros de datos de tipo
        • Si el objeto es una matriz de Java, necesita un espacio para registrar la longitud de la matriz, porque no puede determinarse por la información de metadatos de los objetos de Java ordinarios
    • Datos de ejemplo
      • La información efectiva que el objeto realmente almacena, es decir, el contenido de varios tipos de campos definidos.
      • El orden de almacenamiento se ve afectado por el orden en que las estrategias y los campos de asignación de máquinas virtuales se definen en el código fuente
        • Asignación predeterminada de HotSpot (los campos del mismo ancho se asignan juntos): longs / doubles, ints, short, chars, bytes / booleans, oops (punteros de objetos ordinarios)
        • El campo definido por la clase padre está antes de la subclase
        • Si el valor del parámetro CompactFields es verdadero, las variables más estrechas de la subclase se insertarán en los huecos de las variables de la clase primaria
    • Alinear el relleno
      • Rol de marcador de posición
      • Hotspot estipula que la dirección inicial de un objeto debe ser un múltiplo entero de 8 bytes, es decir, el objeto debe ser un múltiplo entero de 8 bytes
      • El encabezado del objeto es un múltiplo de 8 bytes (1x o 2x), por lo que esta parte es para completar los espacios en los datos de la instancia cuando sea necesario
  • Orientación de acceso
    • La JVM manipula los objetos en el montón a través de los datos de referencia en la pila, y su esencia es solo una referencia al objeto
    • La forma está determinada por la máquina virtual, las dos corrientes principales actuales
      • Manejar acceso
        • La memoria se divide en el montón como grupo de identificadores y la referencia almacena la dirección del identificador del objeto.
        • El controlador incluye información de dirección de datos de instancia de objeto y datos de tipo
        • La ventaja es la estabilidad, cuando se mueve el objeto, solo se cambia la dirección de datos de instancia del identificador
      • Acceso directo al puntero (punto de acceso)
        • Dirección de objeto almacenada por referencia
        • El objeto de montón correspondiente debe almacenar información sobre los datos de tipo (puntero Klass)
        • La ventaja es la alta eficiencia, ahorrando el tiempo de posicionamiento del puntero
Publicado 24 artículos originales · elogiado 0 · visitas 104

Supongo que te gusta

Origin blog.csdn.net/jiangxiayouyu/article/details/105614174
Recomendado
Clasificación