JVM --- pila de máquinas virtuales Java

Pila de máquinas virtuales

Descripción general de la pila de máquinas virtuales

Debido al diseño multiplataforma, las instrucciones de Java se diseñan de acuerdo con la pila. Debido a que las diferentes plataformas tienen diferentes arquitecturas de CPU, no se pueden diseñar para que estén basadas en registros. La ventaja es que es multiplataforma, el conjunto de instrucciones es pequeño y el compilador es fácil de implementar, pero la desventaja es que el rendimiento se reduce y se necesitan más instrucciones para lograr la misma función.

¿Por qué muchos desarrolladores de Java cuando mencionan la estructura de la memoria de Java, entienden el área de memoria en la JVM como solo el montón de Java y la pila de Java?

Primero, la pila es la unidad de tiempo de ejecución y el montón es la unidad de almacenamiento.

  • La pila resuelve el problema de ejecución del programa, es decir, cómo se ejecuta el programa o cómo procesar los datos.

  • El montón resuelve el problema del almacenamiento de datos, es decir, cómo y dónde colocar los datos.

¿Qué es la pila de máquinas virtuales Java?

  • Pila de máquina virtual de Java (Pila de máquina virtual de Java), también llamada pila de Java en los primeros días. Cuando se crea cada hilo, se crea una pila de máquina virtual, que guarda un marco de pila (StackFrame), correspondiente a las llamadas al método Java una y otra vez.
  • La pila de la máquina virtual Java es privada para el hilo.
    Inserte la descripción de la imagen aquí

ciclo vital

El ciclo de vida es el mismo que el del subproceso, es decir, cuando el subproceso termina, la pila de la máquina virtual también se destruye.

efecto

Responsable del funcionamiento de los programas Java, guarda las variables locales y resultados parciales del método, y participa en la llamada y devolución del método.

  • Variables locales, que se comparan con variables miembro (o atributos)
  • Variable de tipo de datos básicos VS variable de tipo de referencia (clase, matriz, interfaz)

Características de la pila

La pila es una forma rápida y efectiva de asignar almacenamiento, la velocidad de acceso es superada solo por el contador del programa. La JVM tiene solo dos operaciones directas en la pila de Java:

  • Cada método se ejecuta, acompañado de push (push, push)
  • Apilar el trabajo después de la ejecución

Nota: No hay ningún problema de recolección de basura para la pila (la pila se desborda)

¿Cuáles son las excepciones encontradas durante el desarrollo?

La especificación de la máquina virtual Java permite que el tamaño de la pila de Java sea dinámico o fijo.

Si se utiliza una pila de máquina virtual Java de tamaño fijo, la capacidad de pila de la máquina virtual Java de cada subproceso se puede seleccionar de forma independiente cuando se crea el subproceso. Si la capacidad de la pila asignada por la solicitud de subproceso excede la capacidad máxima permitida por la pila de la máquina virtual Java, la máquina virtual Java lanzará una excepción StackoverflowError.

Y si la pila de la máquina virtual Java se puede expandir dinámicamente y no puede solicitar suficiente memoria al intentar expandirse, o no hay suficiente memoria para crear la pila de la máquina virtual correspondiente cuando se crea un nuevo hilo, la máquina virtual Java arrojará un Excepción outofMemoryError.

public class StackErrorTest {
    
    
    private static int count = 1;
    public static void main(String[] args) {
    
    
        System.out.println(count++);
        main(args);
    }
}
9656
Exception in thread "main" java.lang.StackOverflowError

Establecer el tamaño de la memoria de la pila

Puede utilizar la opción -Xss del parámetro para establecer el espacio máximo de pila del hilo. El tamaño de la pila determina directamente la profundidad máxima alcanzable de la llamada a la función.

-Xss1m
-Xss1k

Unidad de almacenamiento apilable

  • Cada subproceso tiene su propia pila y los datos de la pila existen en el formato de un marco de pila.
  • Cada método que se ejecuta en este hilo corresponde a un marco de pila.
  • El marco de pila es un bloque de memoria y un conjunto de datos que mantiene diversa información de datos durante la ejecución del método.

¿Qué se almacena en la pila?

  • Lo que se almacena en la pila es el marco de la pila, y el método y la información de clase se almacenan en el marco de la pila.

  • JVM tiene solo dos operaciones directas en la pila de Java, a saber, empujar y hacer estallar el marco de la pila, siguiendo el principio de "primero en entrar, último en salir" y "último en entrar, primero en salir".

  • En un hilo activo, solo habrá un marco de pila activo en un momento determinado. Es decir, solo el marco de pila (marco de pila superior) del método que se está ejecutando actualmente es válido. Este marco de pila se denomina marco de pila actual (Marco actual), y el método correspondiente al marco de pila actual es el método actual (Método actual La clase que define este método es la clase actual (Current Class).

  • Todas las instrucciones de código de bytes ejecutadas por el motor de ejecución solo operan en el marco de pila actual.

  • Si se llaman a otros métodos en este método, se creará el nuevo marco de pila correspondiente y se colocará en la parte superior de la pila, convirtiéndose en el nuevo marco actual.
    Inserte la descripción de la imagen aquí
    El siguiente código explica brevemente:

public class StackFrameTest {
    
    
    public static void main(String[] args) {
    
    
        method01();
    }

    private static int method01() {
    
    
        System.out.println("方法1的开始");
        int i = method02();
        System.out.println("方法1的结束");
        return i;
    }

    private static int method02() {
    
    
        System.out.println("方法2的开始");
        int i = method03();;
        System.out.println("方法2的结束");
        return i;
    }
    private static int method03() {
    
    
        System.out.println("方法3的开始");
        int i = 30;
        System.out.println("方法3的结束");
        return i;
    }
}

El resultado de salida es:

方法1的开始
方法2的开始
方法3的开始
方法3的结束
方法2的结束
方法1的结束

Cómo funciona la pila

  • Los marcos de pila contenidos en diferentes subprocesos no pueden hacer referencia entre sí, es decir, es imposible hacer referencia al marco de pila de otro subproceso en un marco de pila.
  • Si el método actual llama a otros métodos, cuando el método regresa, el marco de pila actual devolverá el resultado de la ejecución de este método al marco de pila anterior. Luego, la máquina virtual descarta el marco de pila actual para que el marco de pila anterior se convierta en el actual. apilar el marco de nuevo.
  • Hay dos formas de devolver una función en un método Java, una es regresar de una función normal, usando la instrucción return; la otra es lanzar una excepción. Independientemente del método que se utilice, hará que el marco de la pila salte.

La estructura interna del marco de la pila.

Almacenado en cada marco de pila:

  • Tabla de variables locales (variables locales)
  • Pila de operandos (o pila de expresiones)
  • Enlace dinámico (o referencia de método que apunta al grupo de constantes de tiempo de ejecución)
  • Dirección de retorno del método (o la definición del método sale normal o anormalmente)
    Alguna información adicional
  • La pila debajo de cada subproceso en paralelo es privada, por lo que cada subproceso tiene su propia pila, y hay muchos marcos de pila en cada pila. El tamaño del marco de pila está determinado principalmente por la tabla de variables locales y la pila de operandos.
    Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_33626996/article/details/113564947
Recomendado
Clasificación