Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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