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.
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:
test02:
test03: