"Refactorización: mejora del diseño del código existente" Máquina virtual Java uno: área de datos en tiempo de ejecución

Tabla de contenido

 

Área de datos en tiempo de ejecución

1. Contador de programas

2. Pila de máquinas virtuales Java

3. Pila de métodos locales

4 montón de Java

5. Área de métodos

6. Grupo de constantes en tiempo de ejecución


Área de datos en tiempo de ejecución

En el proceso de ejecución del programa Java, la máquina virtual Java divide la memoria en varias áreas de datos diferentes. Cada área tiene su propio propósito, tiempo de creación y destrucción. Según la "Java Virtual Machine Specification (Java SE 7 Edition)", el área de datos de tiempo de ejecución de la máquina virtual tiene principalmente los siguientes tipos:

 

1. Contador de programas

  El contador de programa es un área pequeña de memoria que puede verse como un indicador del número de línea del código de bytes ejecutado por el hilo actual. En el modelo conceptual de la máquina virtual, cuando el intérprete de código de bytes funciona, selecciona la siguiente instrucción de código de bytes a ejecutar cambiando el valor del contador de programa, bifurcación, bucle, salto, manejo de excepciones, recuperación de subprocesos y otras funciones básicas. Depende del contador de programas. En el subproceso múltiple, cada subproceso tiene un contador de programa independiente, y los contadores de programa de cada subproceso no se afectan entre sí, es decir, "subproceso privado". Al mismo tiempo, el contador del programa es la única área en la especificación de la máquina virtual Java que no especifica OutOfMemoryError.

2. Pila de máquinas virtuales Java

  La pila de la máquina virtual describe el modelo de memoria de la ejecución del método Java. Cuando se ejecuta cada método, se crea un marco de pila para almacenar la tabla de variables locales, la pila de operandos, el enlace dinámico, la salida del método y otra información. El proceso de cada método desde que se llama hasta que se completa la ejecución corresponde al proceso de un marco de pila desde que se empuja hasta que aparece en la pila de la máquina virtual. La pila de la máquina virtual también es privada para el hilo. En la especificación de la máquina virtual Java, hay dos condiciones anormales en la pila de la máquina virtual:

(1) La profundidad de la pila solicitada por el subproceso es mayor que la profundidad permitida por la pila de la máquina virtual, y se lanzará una excepción StackOverflowError;

(2) Si la pila de la máquina virtual se puede expandir dinámicamente, pero no puede solicitar suficiente memoria durante la expansión, o no hay suficiente memoria para crear la pila de la máquina virtual al crear un nuevo hilo, se lanzará una excepción OutOfMemoryError.

3. Pila de métodos locales

  La función de la pila de métodos nativos y la pila de máquinas virtuales es similar, la diferencia es que la pila de máquinas virtuales Java admite la ejecución de métodos Java, mientras que la pila de métodos locales admite la ejecución de métodos nativos. Algunas máquinas virtuales combinan directamente la pila de la máquina virtual Java y la pila del método local en una, y las excepciones de la pila del método local son consistentes con la memoria de la pila de la máquina virtual Java, a saber:

(1) La profundidad de la pila solicitada por el hilo es mayor que la profundidad permitida por la pila del método nativo y se lanzará una excepción StackOverflowError;

(2) Si la pila del método local se puede expandir dinámicamente, pero no puede solicitar suficiente memoria durante la expansión, o no hay suficiente memoria para crear la pila del método local al crear un nuevo hilo, se lanzará una excepción OutOfMemoryError.

4 montón de Java

  El montón de Java es la mayor parte de la memoria administrada por la máquina virtual Java. Es un área de memoria compartida por todos los subprocesos y se crea cuando se inicia la máquina virtual. El montón de Java es el área donde todas las instancias de clase y matrices asignan memoria, y también es el área principal administrada por el recolector de basura, por lo que a menudo se denomina "montón de GC". Desde la perspectiva de la recuperación de la memoria, dado que los recolectores básicamente usan algoritmos de recolección generacionales, los montones de Java también se pueden subdividir en generación joven (Young Gen) y generación vieja (Old Gen). La nueva generación puede continuar dividida en el espacio Edén, Desde el espacio Survivor hasta el espacio Survivor. Como se muestra abajo:

  El tamaño del montón de Java puede ser fijo, o puede expandirse dinámicamente con la ejecución del programa y reducirse automáticamente cuando se necesita demasiado espacio. Y no es necesario garantizar que la memoria utilizada por el montón de Java sea continua. Si el montón real requerido excede la capacidad máxima que puede proporcionar el sistema de administración de memoria automática, la máquina virtual java lanzará una excepción OutOfMemoryError.

  Parámetros de ajuste comunes para el montón de Java:

   -Xms128M: establece el tamaño de pila inicial en 128M
   -Xmx512M: establece el tamaño de pila máximo en 512M
   -XX: NewSize = n: establece el tamaño de la generación joven;
   -XX: NewRatio = n: establece la proporción de la generación joven con respecto a la generación anterior, como 3. Significa que la proporción de la generación joven a la generación vieja es 1: 3, y la generación joven representa 1/4 de la generación joven;
   -XX: SurvivorRatio = n: la proporción del área del Edén a las dos áreas de sobrevivientes en la generación joven (joven La generación se divide en 1 Espacio Edén y 2 Espacio Suviviente. Si se establece en 3, significa Edén: Superviviente = 3: 2, y un área de Superviviente ocupa 1/5 de toda la generación joven;

5. Área de métodos

  El área de método, como el montón de Java, es un área de memoria compartida por todos los subprocesos. Almacena la información estructural de cada clase, como el grupo de constantes en tiempo de ejecución, los datos de campo y método, el contenido del código de bytes de los constructores y los métodos comunes, y también incluye algunos métodos especiales utilizados en la inicialización de clases, instancias e interfaces. Dado que el equipo de diseño de la máquina virtual de HotSpot ha extendido la generación de GC al área de métodos, o ha utilizado la "generación permanente" para implementar el área de métodos, el recolector de basura de HotSpot puede administrar la memoria del área de métodos como un montón de Java, por lo que muchas personas lo harán El área de método se llama generación permanente, pero en esencia los dos no son equivalentes (en Java 8, la implementación de HotSpot del área de método se cambia de la generación permanente al metaespacio metaespacial) . Para otras máquinas virtuales (como BEA JRockit, IBM J9, etc.), no hay generación permanente. De acuerdo con la especificación de la máquina virtual Java, cuando el área de método no puede satisfacer la solicitud de asignación de memoria, la máquina virtual Java lanzará una excepción OutOfMemoryError.

  Parámetros de ajuste comunes en el área de métodos:

  Antes de java8 (establecer generación permanente):

   -XX: PermSize = 64M: establece el tamaño inicial de la generación persistente
   -XX: MaxPermSize = 128M: establece el tamaño de asignación máximo permitido de la generación persistente.

  Después de java8 (establecer metaespacio) :  

   -XX: MetaspaceSize = 8M: Establezca el tamaño del metaespacio en 8M
   -XX: MaxMetaspaceSize = 80M: Establezca el tamaño máximo del
   metaespacio en 80M -XX: MinMetaspaceFreeRatio = n: Después de realizar Metaspace GC, se calculará la relación de espacio libre del Metaspace actual, Si la proporción de inactividad es menor que este parámetro, la máquina virtual aumentará el tamaño de Metaspace. El valor predeterminado es 40, que es 40%
   -XX: MaxMetasaceFreeRatio = n: Después de Metaspace GC, se calculará la proporción de espacio libre del Metaspace actual. Si la proporción de espacio libre es mayor que este parámetro, la máquina virtual liberará parte del espacio de Metaspace. El valor predeterminado es 70, que es 70%
   -XX: MaxMetaspaceExpansion = n: establece la cantidad máxima de crecimiento de Metaspace
   -XX: MinMetaspaceExpansion = n: establece la cantidad mínima de crecimiento de Metaspace

6. Grupo de constantes en tiempo de ejecución

  El grupo de constantes de tiempo de ejecución es parte del área de método, que es la manifestación de la tabla de grupo de constantes de cada clase o interfaz en el archivo de clase en tiempo de ejecución. Después de cargar la clase y la interfaz a la máquina virtual, se crea el grupo de constantes de tiempo de ejecución correspondiente. Si el espacio de memoria necesario para construir el grupo de constantes de tiempo de ejecución excede el valor máximo que el área de método puede proporcionar, la máquina virtual Java lanzará una excepción OutOfMemoryError.

  Se debe prestar especial atención a la diferencia entre el grupo de constantes de tiempo de ejecución y el grupo de constantes de cadena. Antes de jdk1.7, la lógica del grupo de constantes de tiempo de ejecución incluía el grupo de constantes de cadena almacenado en el área de métodos. En este momento, la máquina virtual de hotspot implementa el área de métodos como Generación permanente. En JDK1.7, el grupo de constantes de cadena se toma del área de método al montón, y el resto del grupo de constantes de tiempo de ejecución todavía está en el área de método, que es la generación permanente en el punto de acceso. JDK1.8 hotspot elimina la generación permanente e introduce el metaespacio (Metaspace). En este momento, el grupo de constantes de cadena todavía está en el montón, y el grupo de constantes todavía está en el área de método en tiempo de ejecución, pero la implementación del área de método ha cambiado de generación permanente a metaespacio. (Metaspace).

 

Materiales de referencia:

"Comprensión en profundidad de las funciones avanzadas y las mejores prácticas de Java Virtual Machine JVM, 2.ª edición"

"Especificación de máquina virtual Java (Java SE 7)"

Supongo que te gusta

Origin blog.csdn.net/someby/article/details/103791106
Recomendado
Clasificación