JVM - Webcourse

Download Report

Transcript JVM - Webcourse

The JVM
oop
What’s a JVM

A computing machine (just like 8086, but not produced by Intel)
 Abstract: machine is specified in a book.
 Concrete: anyone can implement

Input:
 A “class” file
 a binary file with lots of numbers and instructions.
 A search path (to find more class files)

Output
 The “execution” of the class file.

How?
 It is all in The Java Virtual Machine Specification, by Tim Lindholm and
Frank Yellin

Start with?
 A method named “main” in a given class file.
 The method must have certain properties
 Continue execution in other methods as necessary.
oop
Class File?
 The binary form for Java programs
 Represents a complete description of one Java
class or interface
 Platform independent – bytecodes are the machine
language of the JVM
 Not necessarily linked to the java language:
Java
Program
in Java
Lang.
Program
in other
Lang.
Compiler
class
files
Java
Compiler
class
files
Program
in Java
Lang.
oop
Compiler
Other
Binary
format
Class File Structure
 Part I: Pool
Maps strings to integers.
Mostly symbolic names.
 Part II: instructions for execution
Organized in “methods”
Each reference to another method, or
another class file is through a “small
integer” (index to the pool)
oop
Basic JVM Components
The Java Virtual Machine
Program
Class
files
The Java
API’s
class files
Class
loader
Execution
engine
Native methods invocation
Host operating system
oop
Semantics of the Abstract Machine
 Low level, Assembly Like:
 no expression such as (a + b) *c
 No ordinary memory addressing (cannot access
address 1000)
 Use symbolic names, as defined in the pool.
 Garbage collected!
 No registers (stack semantics)
 To do (a+b)*c:
Push a
Push b
Add
Push c
Mult
 Scratch variables (used for storing arguments and local
variables)
Each method defines how many it needs
oop
Typed Assembly
 High Level Language
f(int a, int b, int c, int d) {
return (a + b) *c - d;
}
 Class
0:
1:
2:
3:
4:
5:
6:
7:
oop
iload_1
iload_2
iadd
iload_3
imul
iload 4
isub
ireturn
JVM Types
 Similar (but not identical) to Java
 Primitive data types.







byte: one byte
short: two bytes
int: four bytes
long: eight bytes (2 entries on stack)
float: four bytes
double: eight bytes (2 entries on stack)
char: two bytes
 Reference types:
 Class reference
 Interface reference
 Array reference
oop
Object Oriented Assembly
 No ordinary memory model
 All memory references are through fields.
 A class file defines a class, just like any other
object oriented language:
 Class has:
 Fields (also static)
 Methods (also static)
 Constructors,
 ...
 Multi-threaded language
 Exception support
 So that constructors can fail
oop
Memory Model
 Areas:
 Stacks (no single stack, since we have threads)
 Usually organized as a linked list
 Elements: method frames which include
• Local Variables Array (LVA)
• Operand stack (OS)
 Accessible by push/pop instructions.
 Garbage collected
 Heap
 All objects and all arrays
 No object is allocated in the stack
 Each object is associated with a class stored in the
method area
 Garbage collected.
 Method area
 Information about types, constant pool, fields and method i
 Inaccessible to programmer
 Garbage collected
oop
Typed Instructions
 Most JVM instructions are typed !
 Enables bytecode verification at load time
 “xload v” (x ∈ {a, i, l, f, d})




Loads (i.e. pushes) a variable v on the stack
The prefix specifies the type
If x = l (long) or x = d (double) then two words are pushed
Otherwise, the type annotation is only for type checking
 “xstore”
 Stores in an array (the array, the index and the stored value are
popped from the operand stack)
 This is the first successful attempt to bring type
safety to a lower level language
oop
JVM Instruction Set
1.
2.
3.
4.
5.
6.
7.
oop
Arithmetic
Stack Manipulation
Variables and Constants
Conversions
Arrays
Objects (methods and fields)
Control
Some Instructions
 Arithmetic:
 iadd, isub, imul, idiv, ineg, irem
 Bitwise (ints & longs) : iand, ior, ixor, ishl, ishr, iushr
 Stack Manipulation:
 Swap, pop, dup
 Versions that work on two words at a time: pop2, dup2
 Load and Store:
 Locals -> Stack: [i/f/l/d/a]load n
 Stack ->Locals: [i/f/l/d/a]store n
 Specialized load and store instructions:
 iload_1 pushes int from local variable position one onto stack
oop
Some More Instructions
 Type Conversions (casts)
 The JVM pops the value at the top of the stack, converts it, and
pushes the result back onto the stack.
 i2f converts int to float
 Instructions for Arrays
 newarrray <type>: Allocates an array of primitives
 anewarrray <classname>: Allocates an array of references
 Instructions for Objects
 new <classname>
 Followed (separately) by call to constructor,
 getfield <full-fieldname> <field-type>
 invokevirtual <full-methodname> <method-type>
 Stack: ... object-reference params -> ... returned-value
oop
Some More Instructions
 Control Instructions
 All control structures (if, switch, while, for, break,
continue) are translated to labels and branches to
labels
Labels have method scope
 Labels are translated into offsets from the beginning
of the branch instruction to the beginning of the
labeled instruction
 goto, if_icmpeq, if_acmpeq, ifnull…
oop
Type Checking Strategies





None (e.g., PDP11 assembly)
Compile time only (e.g., C++)
Runtime only (e.g., Smalltalk)
Compile time and runtime (e.g., C#)
Load time: JVM
 Rationale:
No compilation process
Any hacker can mess with the bytecodes.
oop
Type Checking in the JVM
 At each code location (byte offset of the
method code)
 The number of cells used in LVA and OS is known.
 Each cell has one, and only one type
Primitive/reference.
 Only instructions that treat the cells “as they
should” are allowed:
No arithmetical operations on characters.
Cannot push two integers and then pop a long.
Only apply methods if the object knows about them.
oop
Verification
 When?
 Mainly during the load and link process
 Why?
 No guarantee that the class file was generated by
a Java compiler
 Enhance runtime performance
 Examples
 There are no operand stack overflows or
underflows.
 All local variable uses and stores are valid.
 The arguments to all the Java Virtual Machine
instructions are of valid types.
oop
Verification Process
 Pass 1 – when the class file is loaded
 The file is properly formatted, and all its data
is recognized by the JVM
 Pass 2 – when the class file is linked
 All checks that do not involve instructions
final classes are not subclassed, final
methods are not overridden.
Every class (except Object) has a
superclass.
All field references and method references in
the constant pool have valid names, valid
classes, and a valid type descriptor.
oop
Verification Process – cont.
 Pass 3 – still during linking
 Data-flow analysis on each method . Ensure that at any given
point in the program, no matter what code path is taken to
reach that point:
 The operand stack is always the same size and contains the
same types of objects.
 No local variable is accessed unless it is known to contain a
value of an appropriate type.
 Methods are invoked with the appropriate arguments.
 Fields are assigned only using values of appropriate types.
 All opcodes have appropriate type arguments on the operand
stack and in the local variables
 Pass 4 - the first time a method is actually invoked
 a virtual pass whose checking is done by JVM instructions
 The referenced method or field exists in the given class.
 The currently executing method has access to the referenced
method or field.
oop
JVM in Java Architecture
 Java’s architecture main technologies:
 The Java programming language
Source files
 The Java class file format
Compiled files
 The Java API
Provide access to system resources
 The Java virtual machine
Runs the class files
oop
The Java Programming Environment
Compile time environment
A.Java
B.Java
C.Java
oop
B.class
A.class
B.class
C.class
Java
Virtual
Machine
Java
Compiler
A.class
run time environment
C.class
Object class
String class