Serie JVM - la comprensión en profundidad de la zona de memoria de JVM

prefacio

El Java .classde archivos a través de las cargas cargador de clases en la memoria dentro de una máquina virtual, JVM mediante el análisis ejecutado por una máquina virtual, o la implementación de compilación. Con el fin de facilitar la gestión de JVM vienen cargados .classde contenido, el concepto de la máquina virtual de área de datos de tiempo de ejecución Java. área de datos de la máquina virtual Java de tiempo de ejecución se puede dividir en hilos privados, hilos comparten los dos tipos de área de datos, que incluye un privado hilo contador de programa, pila de la máquina virtual, pilas de métodos nativos, y los hilos comparten incluyendo montón de Java, el área de método.

En ausencia de área de datos vamos a menudo de grano grueso comprensión en profundidad de JVM, Java Runtime dividido en una "pila", "pila" de dos partes, "montón" se utiliza para almacenar el objeto se crea una instancia, y se utiliza "pila" para almacenar las referencias a objetos. Con nuestro estudio en profundidad sobre la JVM, se encontró que la división de la memoria de la JVM de lo que en la etapa inicial del área de datos en tiempo de ejecución de Java aprendizaje cognitivo a ser complicado. C / C ++ programadores necesitan programa de liberación manual, que no necesita espacio de memoria reutilización, mientras que en Java, la máquina virtual ayuda automáticamente a nosotros reclamamos recursos no necesitan el uso, lo que nos obliga a entender la memoria de tiempo de ejecución de JVM división, nos ayudará a tener una comprensión más profunda del programa.

área de datos detallada

Contador de programa

Contador de programa (Programa de Registro Contador) es un área relativamente pequeña de datos. Debido a que Java es para apoyar multi-hilo, que significa que dentro de cada hilo necesita un espacio de memoria, el tiempo de grabación de la conmutación hilo actual (en el lugar de destrucción), número de línea de la ejecución de código byte actual, con el fin de volver a adquirir el hilo por el tiempo de ejecución de la CPU tiempo, código de bytes puede ser ejecutado último número de filas para continuar (restauración del sitio). Y el contador de programa es registrar el número de filas de código de bytes ejecución del número de hilo actual propuesta.

Analizador de código de bytes es una necesidad de resolver el valor del contador se selecciona en función de la ejecución de las instrucciones de código de bytes. Circulación código Java, salto, manejo de excepciones, la recuperación del hilo y por lo tanto necesitan confiar en que el contador completa.

Si el hilo está ejecutando un método Java, el contador registra la dirección de la instrucción de máquina bytecode virtual que se ejecuta; método nativo se realiza si el valor de este contador es null (Indefinido). El contador de programa es el único JVM no prevé ninguna situación OOM área.

pila VM

pila Virtual Machine (Máquina Virtual Java Pilas) es también un hilo privada, su ciclo de vida y el mismo hilo. Es una máquina virtual pila modelo de memoria se describe el método de Java ejecutada: cada uno va a ejecutar un método en Java para crear un marco de pila, entonces este sistema se acumulará marco empujó pila de la máquina virtual. marco de pila también puede dividirse en una tabla de variables locales, la pila de operandos, enlace dinámico, la salida de método (dirección de retorno del método), así como extensiones adicionales. Java método de ejecución corresponde al proceso de empujar y hacer estallar el marco de pila en la máquina virtual.

  • tabla de variables locales se almacena en el principal método de variables locales durante la ejecución. Los ocho tipos, variables locales básicas definidas en el proceso.

  • Manejo de datos se almacena en el operando. Operando estructura de datos pila es una estructura de pila, la pila de elementos puede ser cualquier tipo de datos de Java. Al comenzar un método de asignación de marco de espacio de pila se realiza, la pila de operandos está vacío, cuando la operación de las variables locales en un método de realización, cuando se realiza la pila empuje operando / POP operaciones.

  • El papel principal es el apoyo dinámico que une polimorfismos lenguaje Java (método de carga de clases de necesidades para determinar el tiempo de ejecución), dinámico.

  • El método devuelve la dirección devuelta es el resultado del método de devolución. Si un rendimiento normal, el contador de programa es la dirección como una llamada de retorno; si se devuelve la excepción, que es (trama no pila) se determina por la tabla de controlador de excepciones.

Al mismo tiempo, Java especificación de la máquina virtual define una pila de la máquina virtual tiene dos anomalías:

anormal definiciones
StackOverflowError Emite marco de pila cuando la profundidad de la pila supera la profundidad de la máquina virtual solicita un inicio de la trama actual de la pila definida
Error de memoria insuficiente Si la máquina virtual de forma dinámica puede aplicar la memoria de pila en tiempo de ejecución, cuando la máquina virtual de Java no se puede aplicar a más Lanza memoria de pila

montones de métodos nativos

Muy similar a las pilas de métodos nativos (Método Nativo Stack) con la pila de la máquina virtual cuando el papel, pero la memoria de pila máquina virtual ofrece un espacio para los métodos habituales de Java, y las pilas de métodos nativos en comparación con el método nativo de Java de proporcionar espacio de memoria. Por lo tanto, algunas máquinas virtuales como Sun HotSpot máquina virtual directamente a la máquina virtual y las pilas de métodos nativos en una pila.

Al mismo tiempo, las pilas de métodos nativos y la pila como una máquina virtual, pueden también tirar StackOverFlowError, OutOfMemoryErrordos tipos de excepciones.

montón de Java

Java Virtual Machine montón es la pieza más grande de espacio de memoria, sino también el área de memoria puede ser compartido por cada hilo. montón de Java se crea cuando se crea la máquina virtual, su propósito principal para almacenar una instancia de objeto, una matriz de datos. Con el desarrollo del compilador JIT, el desarrollo de técnicas de análisis de escape, tales objetos se puede asignar en la pila.

montón de Java es la colección principal área de GC basura. Desde el punto de vista de la recuperación de la memoria, sobre todo porque el montón de Java y tomar desde el espacio sobreviviente survice algoritmo de recolección generacional, que se puede dividir en la nueva generación de pila de Java, años de edad, y la nueva generación y se puede dividir en el espacio Edén.

Desde la perspectiva de la memoria compartida, almacenamiento dinámico de Java se puede dividir en varios subprocesos compartir búfer asignado (rosca de Asignación Local Buffer, TLAB).

La especificación de la máquina virtual, pila Java puede ser memoria física discontinua, y en el contiguos lógicamente. Al mismo tiempo, la fuerza de la asignación del montón no puede ser completada, y la máquina virtual no puede aplicarse a amontonar más tiempo, lanzará OutOfMemoryErroruna excepción.

En una máquina virtual, la instancia de objeto principal es asignar el montón Java, instancias de objetos en la disposición de memoria es el siguiente:

Memoria instancia de objeto de diseño se divide en tres áreas: cabecera del objeto (Header), datos de instancia (instancia), relleno de alineación (relleno).

  • cabecera de objeto (Header), incluyendo dos piezas de información en el HotSpot: medios para almacenar datos de tiempo de ejecución objeto en sí mismo, el tipo de puntero. Para una primera porción para almacenar propios datos de tiempo de ejecución como se muestra arriba, y para el segundo tipo de sección de la aguja, es decir, un puntero al objeto de sus metadatos, la máquina virtual se determina por el objeto de que el puntero de una clase que pertenece. Sin embargo, no todos los tipos de máquinas virtuales necesitan mantener un puntero en los datos de cabecera objeto anterior, ya que el objetivo de la búsqueda no se requiere necesariamente por el propio objeto de metadatos (reflexión).

  • Ejemplos de la parte de datos es objeto válido se almacena la información, tales como diversos tipos de contenidos en los campos definidos fuente de Java, incluyendo heredados de un contenido de datos de la clase padre. Al mismo tiempo que recibe las estrategias de asignación afectan máquina virtual (FieldsAllocationStyle) y los campos en el código fuente de Java con el fin de la sección de almacenamiento de datos de instancia.

  • relleno de alineación no necesariamente existe en la instancia de objeto de disposición, hay ningún significado particular. Debido a que el sistema automático de gestión de memoria requiere que el tamaño de la máquina virtual de la necesidad objeto a ser un múltiplo entero de 8 bytes. El tamaño de la cabecera objeto es exactamente un múltiplo de 8 bytes (1 veces o 2 veces), cuando no alineación de datos de instancia, es necesario alinear la terminación de llenado.

Ejemplos de montón objetos almacenados en el objeto Java se utiliza para los objetos de acceso, los programas Java necesarios para operar el objeto de datos de referencia específica en el montón por la máquina virtual en la tabla de variables de pila local. El método de acceso corriente actual utiliza el mango y tiene un puntero directo dos clases.

Al mismo tiempo, la pila de Java puede lanzar OutOfMemoryErroruna excepción.

distrito métodos

método District (Método Area) y el montón de Java, ya que cada hilo es un área de memoria compartida, que se utiliza para la información de clase tienda ha sido cargado en la máquina virtual, constantes, variables estáticas, tiempo de compilador para compilar el código y otros datos, GC en la región parecer relativamente pequeña. Mientras tanto, el método también contiene el tiempo de ejecución zona de la piscina constante.

Runtime piscina constante de los diversos símbolos y literales para el almacenamiento de compilación generado referencia, esta sección siempre entrará en el método de operación de la cantidad de área de almacenamiento de células, después de cargar la clase.

  • Varios literal y el lenguaje nivel conceptual similar a Java, contiene la cadena de texto, declarada como una constante final y así sucesivamente;

  • comprendiendo el símbolo de referencia: un nombre completo de clase y un nombre de interfaz y el descriptor y los descriptores, nombre del método, el campo;

Mientras tanto, el método de distrito también puede lanzar OutOfMemoryErroruna excepción.

resumen

Por encima, incluyendo la JVM de ejecución Java .classregión cargado en la JVM divide, respectivamente, hilos y los hilos comparten un área privada. Por supuesto, esto es sólo un pequeño paso comprensión en profundidad del proceso de la JVM, entonces también se necesita saber de Java JVM montón de basura de los marcadores, así como la recolección de basura ......

Supongo que te gusta

Origin juejin.im/post/5e761f74e51d45270f52e22d
Recomendado
Clasificación