Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Local variables in java bytecode

Tags:

java

bytecode

I am trying to learn java bytecode and I stumbled on this: I compiled this very simple code with the -g option:

public class Test
{
 public static void main(String args[])
 {
  double a = 1.0;
  int b = (int)a;
 }
}

The main code turned out to be:

0 dconst_1
1 dstore_1
2 dload_1
3 d2i
4 istore_3
5 return

In addition, main's maximum local variables is 4, and the LocalVariableTable has only 3 entries (args, a, b). I am curious to know why the compiler reserved 4 local variables while there is clearly only 3, and localvariable[2] is not used. Is there something I'm missing? Thank you

like image 480
H-H Avatar asked Nov 21 '09 09:11

H-H


People also ask

What is the format of bytecode in Java?

Bytecode is the compiled format for Java programs. Once a Java program has been converted to bytecode, it can be transferred across a network and executed by Java Virtual Machine (JVM). Bytecode files generally have a . class extension.

How is bytecode executed in Java?

They can be executed by intepretation, just-in-time compiling, or any other technique that was chosen by the designer of a particular JVM. A method's bytecode stream is a sequence of instructions for the Java virtual machine. Each instruction consists of a one-byte opcode followed by zero or more operands.

What is JVM and bytecode in Java?

Java Virtual Machine (JVM) is a engine that provides runtime environment to drive the Java Code or applications. It converts Java bytecode into machines language. JVM is a part of Java Run Environment (JRE). In other programming languages, the compiler produces machine code for a particular system.

Where does JVM store local variables and object types?

The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated. Integer b = 2; the local variable b is stored in the stack memory and contains a reference to a heap allocated Integer object.


1 Answers

it is 4 because long and double occupies 2 consecutive entries in the frame. This is clearly specified by the Java JVM specification:

A value of type long or type double occupies two consecutive local variables. Such a value may only be addressed using the lesser index. For example, a value of type double stored in the local variable array at index n actually occupies the local variables with indices n and n +1; however, the local variable at index n +1 cannot be loaded from. It can be stored into. However, doing so invalidates the contents of local variable n.

like image 69
dfa Avatar answered Oct 04 '22 07:10

dfa