Serie de recolección de basura y memoria JVM: contador de programa

Contador de programa

Introducción

En el registro de contador de programa en la JVM, el nombre del registro se deriva del registro de la CPU, y el registro almacena información en el sitio relacionada con las instrucciones. La CPU solo puede funcionar cargando datos en los registros. Aquí, no es un registro físico en un sentido amplio, quizás sea más apropiado traducirlo como un contador de PC (o contador de instrucciones) (también llamado programa hook), y no es fácil causar malentendidos innecesarios. El registro de PC en la JVM es una simulación abstracta del registro de PC físico.

imagen-20200705155551919

Es un espacio de memoria pequeño, casi insignificante. También es el área de almacenamiento más rápida.

En la especificación de JVM, cada subproceso tiene su propio contador de programa, que es privado para el subproceso, y su ciclo de vida es coherente con el ciclo de vida del subproceso.

Solo hay un método en un hilo en cualquier momento, que es el llamado método actual. El contador del programa almacena la dirección de la instrucción JVM del método Java que está siendo ejecutado por el hilo actual; o, si se está ejecutando el método nativo, es un valor sin definir (sin definir).

Es un indicador del flujo de control del programa. Las funciones básicas como ramas, bucles, saltos, manejo de excepciones y recuperación de subprocesos deben depender de este contador para completarse. Cuando el intérprete de código de bytes funciona, selecciona la siguiente instrucción de código de bytes que se ejecutará cambiando el valor de este contador.

Es la única área que no especifica ninguna condición outotMemoryError en la Especificación de la máquina virtual Java.

efecto

El registro de la PC se utiliza para almacenar la dirección que apunta a la siguiente instrucción, es decir, el código de instrucción a ejecutar. El motor de ejecución lee la siguiente instrucción.

imagen-20200705155728557

Demostración de código

Primero escribimos un código simple

public class PCRegisterTest {
    
    
    public static void main(String[] args) {
    
    
        int i = 10;
        int j = 20;
        int k = i + j;
    }
}

Luego, el código se compila en un archivo de código de bytes, lo verificamos nuevamente y encontramos que hay un identificador de número de línea en el lado izquierdo del código de bytes, que en realidad es la dirección de instrucción, que se usa para señalar la ejecución actual.

0: bipush        10
2: istore_1
3: bipush        20
5: istore_2
6: iload_1
7: iload_2
8: iadd
9: istore_3
10: return

A través del registro de la PC, podemos saber qué paso ha ejecutado el programa actual imagen-20200705161007423

¿De qué sirve utilizar registros de PC para almacenar direcciones de instrucciones de código de bytes?

Debido a que la CPU necesita cambiar constantemente entre subprocesos, después de volver a cambiar en este momento, debe saber dónde continuar con la ejecución.

El intérprete de código de bytes de la JVM necesita determinar qué instrucción de código de bytes debe ejecutarse a continuación cambiando el valor del registro de la PC.

imagen-20200705161409533

¿Por qué el registro de la PC está configurado como privado?

Todos sabemos que el llamado método de subprocesos múltiples solo ejecutará uno de los subprocesos en un período de tiempo específico. La CPU cambiará constantemente de tareas, lo que inevitablemente conducirá a frecuentes interrupciones o recuperaciones. Cómo asegurarse de que las puntuaciones sean ¿correcto? Para registrar con precisión la dirección de instrucción de código de bytes actual que se ejecuta en cada subproceso, la mejor manera es, naturalmente, asignar un registro de PC para cada subproceso, de modo que se puedan realizar cálculos independientes entre cada subproceso, de modo que no haya interferencia mutua.

Debido a la limitación del intervalo de tiempo de la CPU, en la ejecución simultánea de muchos subprocesos, en cualquier momento determinado, un procesador o un núcleo en un procesador de varios núcleos solo puede ejecutar una instrucción en un determinado subproceso.

Esto conducirá inevitablemente a frecuentes interrupciones o recuperaciones, ¿cómo asegurarse de que no haya diferencia de puntos? Después de que se crea cada subproceso, generará su propio contador de programa y marco de pila, y el contador de programa no se afecta entre sí entre los subprocesos.

imagen-20200705161812542

Rebanada de tiempo de CPU

El intervalo de tiempo de la CPU es el tiempo asignado por la CPU a cada programa. A cada subproceso se le asigna un período de tiempo, que se denomina intervalo de tiempo.

En el nivel macro: Rusia puede abrir múltiples aplicaciones al mismo tiempo, y cada programa se ejecuta en paralelo sin contradicciones.

Pero a nivel micro: dado que solo hay una CPU, solo puede procesar una parte de los requisitos del programa a la vez. Cómo lidiar con la equidad, una forma es introducir intervalos de tiempo y cada programa se ejecuta a su vez.

imagen-20200705161849557

Supongo que te gusta

Origin blog.csdn.net/weixin_43314519/article/details/110410795
Recomendado
Clasificación