Прежде всего, в байт-коде переменные хранятся в слотах переменных и слотах переменных, а не в стеке.Слот может быть повторно использован другой переменной, но не гарантируется, что значение будет удалено из слота переменной.
Например, следующий класс
public class A {
public void method(boolean condition) {
6 if (condition) {
7 Object x = "";
8 System.out.println(x);
9 }
10 System.out.println(condition);
}
}
скомпилирован в этот байт-код:
// class version 50.0 (50)
public class A {
...
// access flags 0x1
public method(Z)V
L0
LINENUMBER 6 L0
ILOAD 1
IFEQ L1
L2
LINENUMBER 7 L2
LDC ""
ASTORE 2
L3
LINENUMBER 8 L3
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 2
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
L1
LINENUMBER 10 L1
FRAME SAME
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (Z)V
L4
LINENUMBER 11 L4
RETURN
L5
LOCALVARIABLE this LA; L0 L5 0
LOCALVARIABLE condition Z L0 L5 1
LOCALVARIABLE x Ljava/lang/Object; L3 L1 2
MAXSTACK = 2
MAXLOCALS = 3
}
Обратите внимание, что переменная x, созданная в строке 7, сохраняется в слоте переменной 2, который по-прежнему доступен в байт-коде, соответствующем строке 10.
Спецификации способаЯзык Java должен быть скомпилирован в байт-код, за исключением нескольких примеров, как правильно скомпилировать некоторые языковые конструкции.Однако компилятору Java разрешено исключать неиспользуемые переменные.Например, если x был назначен, но нигде не используется, компилятору разрешено отбрасывать этот код.Точно так же компилятор включает все статические константы.