1. Descripción general
La máquina virtual Java dividirá la memoria que manejó en varias áreas de datos diferentes en el proceso de ejecutar el programa Java. La memoria administrada por la máquina virtual Java incluirá las siguientes áreas de datos de tiempo de ejecución, como se muestra en la figura a continuación:
Lo siguiente se explica en cada área.
En segundo lugar, el área del programa de datos <Br /> contador <Br /> del programa del programa puede considerarse como un indicador de número de línea del código de byte ejecutado por el hilo actual. En el modelo conceptual de la máquina virtual, el trabajo del intérprete del código de trabajo es seleccionar las instrucciones del código de byte que deben ejecutarse cambiando los valores del contador del programa. La recuperación de hilos y otras funciones básicas deben confiar en este mostrador para completar.
En múltiples thebras, para permitir que el hilo vuelva a la posición de ejecución correcta, cada hilo debe tener un programador independiente.
Cuando el hilo se está ejecutando es un método Java, este contador registra la dirección de la instrucción del código de byte de la máquina virtual que se está ejecutando;
Esta área de memoria es el único área que no especifica ningún OutOfMemoryError.
Pila de máquinas virtuales de Java
La pila de máquinas virtuales Java también es privada, y su ciclo de vida es el mismo que los hilos. La pila de máquinas virtuales describe el modelo de memoria ejecutado por el método Java: cada método creará un marco de pila para almacenar tablas variables locales, operar pilas, listas dinámicas vinculadas, información de exportación de métodos, etc. Desde el proceso de llamado hasta que se llame el proceso de finalización, corresponde al proceso de ingresar la pila en una pila de máquina virtual a la pila.
En la tabla de variables locales, varios tipos de datos básicos (booleano, byte, char, corto, flotante, largo, doble), referencias de objetos y tipos de retorno se almacenan en el compilador.
Si no puede solicitar suficiente memoria durante la extensión, se lanzará la excepción OUTOFMemoryError.
La pila de método local <Br /> Método local es similar a la máquina virtual. . Algunas máquinas virtuales combinan directamente la pila de métodos locales y la pila de máquinas virtuales en una.
Lanzará StackoverFlowror y OutOfMemoryError anormalidades.
Pila de java
La pila Java es un área de memoria compartida por todos los hilos.
La pila Java es el área principal de la gestión del recolector de basura. Dado que el coleccionista se usa básicamente para la división de algoritmos de reciclaje, la pila Java también se puede subdividir como: la nueva generación y la vejez. Desde la perspectiva de la distribución de la memoria, la pila Java marcada de subprocesos puede dividir múltiples hilos de búfer distribuido de forma privada (TLAB).
La pila Java puede estar en un espacio de memoria discontinuo físico, siempre que sea lógicamente continuo. En términos de implementación, no solo puede lograr un tamaño o extensión fija.
Si no hay asignación de instancia de finalización de memoria en el montón, y la pila no se puede completar, el OutOfMemoryError se tirará.
Área de método
El área del método es un área de memoria compartida por varios hilos.
Relativamente hablando, los comportamientos de recolección de basura rara vez han aparecido en esta área, pero no existe permanentemente en el área del método de ingreso de datos.
Cuando el área del método no puede satisfacer las necesidades de distribución de la memoria, el OutOfMemoryError se tirará.
Ejecutando la piscina constante:
Es una parte del área del método, que se utiliza para almacenar varios tipos y referencias de símbolos generadas por el período de compilación.
Memoria directa
La memoria directa no es parte del área de datos cuando la máquina virtual se está ejecutando.
La asignación de memoria directa no estará limitada por el tamaño de la pila Java, pero estará limitada por el tamaño de la memoria, y todos también pueden lanzar una excepción de MememoryrorRor.
Tercero, el proceso de creación, diseño y acceso de objetos
Creación de objetos
Crear un objeto generalmente requiere la nueva palabra clave. Si se ejecuta el proceso de carga de clase correspondiente.
Después de cargar la clase, la máquina virtual asignará memoria para nuevos estudiantes. La tarea de asignar espacio para el objeto es equivalente a dividir un trozo de memoria determinado por el tamaño de la pila Java. Hay dos formas de asignar: una se llama colisión de puntero. Otro nombre es una lista vacía: si la memoria en la pila Java no es regular, la máquina virtual debe mantener una lista, qué registra qué bloque de memoria está disponible. Instancia de objeto. y actualice los registros en la lista. Qué método de distribución está determinado por si el montón de Java está regulado y si el montón de Java está determinado por si el recolector de basura se usa con compresión y función organizativa. Otro problema que debe considerarse es el problema de seguridad del hilo cuando el objeto crea dos soluciones: una es sincronizar la acción de asignar el espacio de memoria; de memoria (TLAB) en la pila Java.
Una vez completada la distribución de la memoria, la máquina virtual debe inicializar el espacio de memoria distribuido al valor cero. Este paso asegura que el campo de instancia del objeto se pueda usar directamente en el código Java sin el valor inicial.
A continuación, la máquina virtual debe establecer la configuración necesaria, como qué clase de este objeto es la instancia de la clase, cómo encontrar la información de metadatos de la clase, etc. Esta información se almacena en el cabezal del objeto del objeto.
Después de completar el trabajo anterior, se ha generado un nuevo objeto desde la perspectiva de la máquina virtual. Sin embargo, desde la perspectiva del programa Java, el método init también se requiere para inicializar el objeto de acuerdo con los deseos del programador.
Diseño de memoria del objeto
En la máquina virtual del punto de acceso, el diseño de los objetos en la memoria se puede dividir en tres partes: cabeza de objeto, datos de instancia y llenado de alineación.
El cabezal del objeto incluye dos partes: la primera parte se utiliza para almacenar los datos del objeto en sí, como el código hash, la edad de envejecimiento de GC y las cerraduras de hilos. El funcionario se llama "Word Mark". La segunda parte es el tipo de puntero, es decir, el puntero del objeto a sus datos de metad de clase, y la máquina virtual determina qué clase de este objeto es por este puntero.
Los datos de la instancia son una información efectiva almacenada en el objeto, y también es una variedad de contenido de campo definido en el código del programa.
El relleno de alineación no necesariamente existe, solo juega el papel del personaje de ocupación. , HotPot VM requiere que la dirección de inicio del objeto sea un múltiple entero de 8 bytes. alineación.
Posicionamiento de acceso a objetos
El programa Java opera el objeto específico en la pila a través de los datos de referencia en la pila. Los principales métodos de acceso son dos tipos: Handle and Direct Pointer:
Personal: Java Heaps dibujará un pedazo de memoria a medida que el grupo de identificadores se almacena en la referencia, y el mango contiene la información de dirección específica de los datos de la instancia del objeto y los datos de tipo. Como se muestra en la figura:
Puntero directo: el diseño del objeto de pila Java debe considerar cómo colocar la información relevante del tipo de datos del tipo de acceso, y la dirección del objeto se almacena en la referencia. Como se muestra en la figura:
Los dos métodos tienen sus propias ventajas. Un gasto de tiempo para el posicionamiento del puntero.
Lo anterior es todo el contenido de este artículo.