Comprensión de la ranura en jvm

Comprensión de la ranura en jvm

  • El almacenamiento de los valores de los parámetros siempre comienza en el índice0 de la matriz de variables locales y termina en el índice de la longitud de la matriz-1.
  • Tabla de variables locales, la unidad de almacenamiento más básica es la ranura (ranura variable)
  • La tabla de variables locales almacena varios tipos de datos básicos (8 tipos), tipos de referencia (referencia) y variables de tipo returnAddress que se pueden conocer en el momento de la compilación.
  • En la tabla de variables locales, el tipo de 32 bits solo ocupa una ranura (incluido el tipo returnAddress) y el tipo de 64 bits (largo y doble) ocupa dos ranuras.
    • Byte, short, char se convierten a int antes del almacenamiento, boolean también se convierte a int, 0 significa falso y distinto de cero significa verdadero.
    • Largo y doble ocupan dos espacios.
  • JVM asignará un índice de acceso a cada ranura en la tabla de variables locales, a través de este índice, puede acceder con éxito al valor de la variable local especificado en la tabla de variables locales
  • Cuando se llama a un método de instancia, sus parámetros de método y las variables locales definidas en el cuerpo del método se copiarán en cada ranura de la tabla de variables locales en orden
  • Si necesita acceder a un valor de variable local de 64 bits en la tabla de variables locales, solo necesita usar el índice anterior . (Por ejemplo: acceder a variables de tipo largo o doble)
  • Si el marco actual es creado por el constructor o el método de instancia, la referencia del objeto se almacenará en la ranura con índice 0 , y los parámetros restantes continuarán ordenados en el orden de la lista de parámetros.

Inserte la descripción de la imagen aquí

El código se demuestra de la siguiente manera:

package com.lbl.LocalVariables;

import java.util.Date;

public class LocalVariablesSoltTest {
    
    
    int count = 0;

    //关于slot的使用理解
    public void test01() {
    
    
        count = 1;
    }

    //this在index0处
    public void test02(){
    
    
        Date date = new Date();
        String s="lbl";
        System.out.println(s+date);
    }

    //double占两个slot
    public void test03(){
    
    
        Date date = new Date();
        double d=2.3;
        String s="lbl";
        System.out.println(s+date);
    }

}

Ilustración:

test01:

Inserte la descripción de la imagen aquí

test02:

Inserte la descripción de la imagen aquí

test03:

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_37924905/article/details/108761222
Recomendado
Clasificación