Programmierung für die JVM Author: Roland Räz, I98b Betreuer: Prof. E.Glatz 1 Inhaltsverzeichnis Einfaches Beispiel JNI Performancesteigerungen 10.01.2001 - v5 Jasmin Oolong Typen Java Assembler JVM Vergleich mit bekanntem Programmierung Diassembler Decompiler Runtime Datenbereiche .class Format Instruktionen Performanceverbesserungen 2 Programmierung für die JVM Einführung 1/3 • Portabilität folgt aus der Laufzeitumgebung 3 Programmierung für die JVM Einführung 2/3 • Portabilität folgt aus der Laufzeitumgebung • virtueller Java Prozessor 4 Programmierung für die JVM Einführung 3/3 • Portabilität folgt aus der Laufzeitumgebung • virtueller Java Prozessor • Ziel: Verständnis der Architektur 5 Programmierung für die JVM JVM - Übersicht 1/4 • Stackarchitektur 6 Programmierung für die JVM JVM - Übersicht 2/4 • Stackarchitektur • keine Register 7 Programmierung für die JVM JVM - Übersicht 3/4 • Stackarchitektur • keine Register • einen Stack + Programm Counter pro Thread 8 Programmierung für die JVM JVM - Übersicht 4/4 • Stackarchitektur • keine Register • einen Stack + Programm Counter pro Thread • objektorientiert 9 Programmierung für die JVM JVM - Typen byte : short : int : long : float : double : char : Boolean: Object : 8 Bits Zweierkomplement, vorzeichenbehaftet 16 Bits Zweierkomplement, vorzeichenbehaftet 32 Bits Zweierkomplement, vorzeichenbehaftet 64 Bits Zweierkomplement, vorzeichenbehaftet 32 Bits Floating-Point, IEEE 754 64 Bits Floating-Point, IEEE 754 2 Bytes, Unicode. true/false 32 Bits, referenziert ein Objekt oder ein Array (ein Array ist ein Objekt) ReturnAddress : 32 Bits 10 Programmierung für die JVM JVM - Runtime Datenbereiche 1/4 • Heap 11 Programmierung für die JVM JVM - Runtime Datenbereiche 2a/4 • Heap • Stack 12 Programmierung für die JVM JVM - Runtime Datenbereiche 2b/4 • Heap • Stack ↑ Operandenstack (push, pop, arithmetische Operationen, Vorbereitung für Methodenaufrufe) Var 3 Var 2 Var 1 Var 0 Lokale Variablen ß this, ausser für statische Methoden 13 Programmierung für die JVM JVM - Runtime Datenbereiche 3/4 • Heap • Stack • Method Area 14 Programmierung für die JVM JVM - Runtime Datenbereiche 4/4 • Heap • Stack • Method Area • Native Method Stack 15 Programmierung für die JVM JVM - .class Format 1/2 ClassFile { u4 magic; // muss den Wert 0xCAFEBABE haben u2 minor_version; // Version u2 major_version; // Version u2 constant_pool_count;// Anzahl Einträge in der constant_pool Tabelle cp_info constant_pool[constant_pool_count-1]; // die constant_pool Tabelle ist Das Layout der // Klasse: Konstanten, Namen, Referenzen u2 access_flags; // PUBLIC ,FINAL, SUPER ,INTERFACE, // ABSTRACT u2 this_class; // Index in die constant_pool Tabelle u2 super_class; // Index in die constant_pool Tabelle u2 interfaces_count;// Anzahl Super-Interfaces diese Interaces oder // der Klasse u2 interfaces[interfaces_count]; // haben Indexe in die constant_pool Tabelle 16 Programmierung für die JVM JVM - .class Format 2/2 u2 fields_count; // Anzahl der fields field_info fields[fields_count]; // Repräsentieren Klassen- oder // Instanzenvariablen greiffen auch wieder auf // die constant_pool Tabelle zurück u2 methods_count; // Anzahl Methoden method_info methods[methods_count]; // Die Methoden u2 attributes_count;// Anzahl Attribute attribute_info attributes[attributes_count]; // Hier werden spezielle Attribute (zum // Beispiel vom einem Debugger) eingetragen. // Attribute die die JVM nicht kennt, überliesst // sie. } 17 Programmierung für die JVM JVM - Instruktionen - Datenzugriff 1/4 Auf Lokale Variablen • • • • • • • • • iload <var_num> iload_ <n> lload <var_num> fload <var_num> istore <var_num> istore_ <n> aload <var_num> astore <var_num> ... etc. pusht einen Integer auf den Stack 4 kurz Versionen für die Variablen 0-3 ... für andere typen popt vom Stack in Variable 4 kurz Versionen für die Variablen 0-3 pusht eine Referenz auf den Stack popt eine Referenz vom Stack 18 Programmierung für die JVM JVM - Instruktionen - Datenzugriff 2/4 auf Objekt/Class Felder • • • • getfield getstatic putfield putstatic <index> object field via einen constant pool descriptor <index> static class field <index> <index> Push von Konstanten Basis form (Operand in der Instruktion) •bipush <byte> (-128 to +127) •sipush <short> (-32768 to +32768) 19 Programmierung für die JVM JVM - Instruktionen - Datenzugriff 3/4 Kurze Form (1 Byte) •iconst_m1 •iconst_<n> •lconst_<l> •fconst_<f> •dconst_<d> (minus 1) (n=0 ... 5) (long, 0 und 1) (float, 0, 1, und 2) (double, 0 und 1) Von der constant pool Tabelle (für Konstanten und Strings) •ldc <index> •ldc_w <index> 20 Programmierung für die JVM JVM - Instruktionen - Datenzugriff 4/4 Arrays •newarray <atype> •anewarray <index> •multianearray •arraylength •iaload •laload •...etc. •iastore •...etc. (Typecode Operand, Grösse auf dem Stack) Object Typ im constant pool, Grösse auf dem Stack) für multidimensionale Arrays (hole Arraylänge, Objektreferenz auf dem Stack) int aus einem Array kopieren (Referenz und Index auf dem Stack) ... anderer Typ int aus einem Array kopieren (Referenz , Index und Ergebniss auf dem Stack) 21 Programmierung für die JVM JVM - Instruktionen - Arithm.& Log. Verkn. Alle Operanden sind auf dem Stack • • • • • • • • • • • • iadd, ladd, fadd, isub, lsub, fsub, imul, lmul, fmul, idiv, ldiv, fdiv, irem, lrem, frem, ineg, lneg, fneg, ishl, lshl ishr, lshr iushr, lushr iand, land ior, lor ixor, lxor dadd dsub dmul ddiv drem dneg Addition Subtraktion Multiplikation Division Modulus Negieren Arithmetisches Linksschieben Arithmetisches Rechtsschieben Logisches Schieben (”unsigned” shift) And (Binär) Or (Binär) Xor (Binär) 22 Programmierung für die JVM JVM - Instruktionen - Konversion und Andere Konversion •i2l, i2f, i2d •l2i, l2f, l2d •f2i, f2l, f2d •d2i, d2l, d2f •int2byte •..etc int to long, int to folat, int to double ... Andere •nop •dup •dup2 •swap •pop •pop2 •tableswitch •..etc dupliziert int dupliziert long vertauscht effiziente Realisierung der bekannten switch Anweisung 23 Programmierung für die JVM JVM - Instruktionen - Sprünge •ifeq <Branch Offset> Sprung wenn tos = zero •ifnull, ifnonnull Testet auf NULL-Referenz •iflt, ifle, ifne, ifgt, ifge Vergleiche •andere Varianten •lcmp, fcmp, dcmp Vergleicht: Resultat -1, 0, oder +1 •goto unbedingter Sprung •jsr ”lightweight” Subroutine •ret 24 Programmierung für die JVM JVM - Instruktionen - Methoden Aufrufe •invokevirtual <index> Stack: objref, arg1, arg2... Normaler Methodenaufruf: Laufzeitprüfung, Methodensignatur im constant pool •invokenonvirtual <index> Stack: objref, arg1, arg2... Zeilbestimmung während dem Kompilieren (nicht üblich) •invokestatic <index> Stack: arg1, arg2, arg3... Aufruf einer Klassenmethode •invokeinterface <index> Java Interface aufrufen 25 Programmierung für die JVM JVM - Programmierung - Assembler 3/3 .source HelloWorld.java .class public synchronized HelloWorld .super java/awt/Frame • Jasmin ; >> METHOD 1 << .method public <init>()V .limit stack 5 .limit locals 1 .line 8 .var 0 is this LHelloWorld; from Label1 to Label2 Label1: aload_0 ldc "1st App" invokenonvirtual java/awt/Frame/<init>(Ljava/lang/String;)V .line 9 aload_0 new java/awt/BorderLayout dup invokenonvirtual java/awt/BorderLayout/<init>()V 26 Programmierung für die JVM JVM - Programmierung - Assembler 3/3 .source HelloWorld.java .class public super HelloWorld .super java/awt/Frame • Jasmin • Oolong .method public <init> ()V .limit stack 5 .limit locals 1 .var 0 is this LHelloWorld; from l0 to l54 .line 8 l0: aload_0 l1: ldc "1st App" l3: invokespecial java/awt/Frame/<init> (Ljava/lang/String;)V .line 9 l6: aload_0 l7: new java/awt/BorderLayout l10: dup l11: invokespecial java/awt/BorderLayout/<init> ()V 27 Programmierung für die JVM JVM - Programmierung - Assembler 3/3 • Jasmin • Oolong •Vergleich mit herkömmlichen Assemblern 28 Programmierung für die JVM JVM - Programmierung - Diassembler 1/3 • Reverse Enineering 29 Programmierung für die JVM JVM - Programmierung - Diassembler 2/3 • Reverse Enineering • D-Java, Gnoolo 30 Programmierung für die JVM JVM - Programmierung - Diassembler 3/3 • Reverse Enineering • D-Java, Gnoolo • Obfuscater 31 Programmierung für die JVM JVM - Programmierung - Decompiler 1/3 • Reverse Enineering 32 Programmierung für die JVM JVM - Programmierung - Decompiler 2/3 • Reverse Enineering • Jad 33 Programmierung für die JVM JVM - Programmierung - Decompiler 3/3 • Reverse Enineering • Jad • Beispiel CS-Directnet 34 Programmierung für die JVM JVM - Programmierung - Performance 1/3 • Beschränkung auf Referenzen 35 Programmierung für die JVM JVM - Programmierung - Performance 2/3 • Beschränkung auf Referenzen • Narrowing 36 Programmierung für die JVM JVM - Programmierung - Performance 3/3 • Beschränkung auf Referenzen • Narrowing • Optimierungsmöglichkeiten 37 Programmierung für die JVM JVM - JNI - Übersicht 1/3 • Java Native Interface 38 Programmierung für die JVM JVM - JNI - Übersicht 2/3 • Java Native Interface • Aufruf von beliebigem Binäcode 39 Programmierung für die JVM JVM - JNI - Übersicht 3/3 • Java Native Interface • Aufruf von beliebigem Binäcode • Auf Win32 > DLL 40 Programmierung für die JVM JVM - JNI - Beispiel 1/3 class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); // deklaration // static: wird beim Laden // ausgeführt // auf Win32 Systemen wird // hello.dll // geladen } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); // Klasse instanzieren und // Aufruf der Methode } } 41 Programmierung für die JVM JVM - JNI - Beispiel 2/3 Tool javah erzeugt aus der HelloWorld.class Datei eine c - Headerdatei javah HelloWorld Implementierung der Native - DLL (C-Sourcecode): #include <jni.h> #include "HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n"); return; } 42 Programmierung für die JVM JVM - JNI - Performance 1/3 • Demo von PerfTest 43 Programmierung für die JVM JVM - JNI - Performance 2/3 • Demo von PerfTest • Steigerung: 3..4 x 44 Programmierung für die JVM JVM - JNI - Performance 3/3 • Demo von PerfTest • Steigerung: 3..4 x • Algorithmen: Defaultverhalten von Vector ist gut 45 Programmierung für die JVM JVM - Weitere Informationen Web Haupt Informationsquelle: http://java.sun.com Gutes Java Glossar mit vielen Links http://mindprod.com/jgloss.html Jasmin: http://mrl.nyu.edu/meyer/jvm/jasmin.html Jad: “Offizielle Homepage” http://www.geocities.com/SiliconValley/Bridge/8617/jad.html Bücher Joshua Engel, “Programming for the Java Virtual Machine”, Addision – Wesley 1999, ISBN 0201-30972-6 Tim Lindholen/Frank Yellin, “The Java Virtual Machine Specificatin”, secon edition 46 Programmierung für die JVM