|
|
|
Sponsored Link •
|
|
Advertisement
|
Virtual parts
The "virtual hardware" of the Java Virtual
Machine can be divided into four basic parts: the
registers, the stack, the garbage-collected heap, and the
method area. These parts are abstract, just like the
machine they compose, but they must exist in some form in
every JVM implementation.
The minimum size of a word in the JVM is 32 bits. Each register in the JVM stores one word. The stack, the garbage-collected heap, and the method area reside somewhere within the JVM's addressable memory. The exact location of these memory areas is a decision of the implementor of each particular JVM.
A word in the Java Virtual Machine is 32 bits. The JVM has a small number of primitive data types: byte (8 bits), short (16 bits), int (32 bits), long (64 bits), float (32 bits), double (64 bits), and char (16 bits). With the exception of char, which is an unsigned Unicode character, all the numeric types are signed. These types conveniently map to the types available to the Java programmer. One other primitive type is the object handle, which is a 32-bit address that refers to an object on the heap.
The method area, because it contains bytecodes, is aligned on byte boundaries. The stack and garbage-collected heap are aligned on word (32-bit) boundaries.
The proud, the few, the registers
The JVM has a program counter and three registers that
manage the stack. It has few registers because the
bytecode instructions of the JVM operate primarily on the
stack. This stack-oriented design helps keep the JVM's
instruction set and implementation small.
The JVM uses the program counter, or pc register, to keep track of where in memory it should be executing instructions. The other three registers -- optop register, frame register, and vars register -- point to various parts of the stack frame of the currently executing method. The stack frame of an executing method holds the state (local variables, intermediate results of calculations, etc.) for a particular invocation of the method.
The method area and the program counter
The method area is where the bytecodes reside. The
program counter always points to (contains the address of)
some byte in the method area. The program counter is used
to keep track of the thread of execution. After a
bytecode instruction has been executed, the program
counter will contain the address of the next instruction
to execute. After execution of an instruction, the JVM
sets the program counter to the address of the instruction
that immediately follows the previous one, unless the
previous one specifically demanded a jump.
The Java stack and related registers
The Java stack is used to store parameters for and
results of bytecode instructions, to pass parameters to
and return values from methods, and to keep the state of
each method invocation. The state of a method invocation
is called its stack frame. The vars, frame, and optop
registers point to different parts of the current stack
frame.
There are three sections in a Java stack frame: the local variables, the execution environment, and the operand stack. The local variables section contains all the local variables being used by the current method invocation. It is pointed to by the vars register. The execution environment section is used to maintain the operations of the stack itself. It is pointed to by the frame register. The operand stack is used as a work space by bytecode instructions. It is here that the parameters for bytecode instructions are placed, and results of bytecode instructions are found. The top of the operand stack is pointed to by the optop register.
The execution environment is usually sandwiched between the local variables and the operand stack. The operand stack of the currently executing method is always the topmost stack section, and the optop register therefore always points to the top of the entire Java stack.
The garbage-collected heap
The heap is where the objects of a Java program live.
Any time you allocate memory with the new
operator, that memory comes from the heap. The Java
language doesn't allow you to free allocated memory
directly. Instead, the runtime environment keeps track of
the references to each object on the heap, and
automatically frees the memory occupied by objects that
are no longer referenced -- a process called garbage
collection.
|
Sponsored Links
|