Föreläsning 22. Tobias Wrigstad. Under huven på JVM. Bytekod. JIT. Reflection. Profiling.

Relevanta dokument
Föreläsning 23. Tobias Wrigstad. Refaktorering

Föreläsning 16. Tobias Wrigstad

Lektion Java Grunder. Javas historia. Programmeringsspråket Java. Skillnaderna mellan Java och C++ JVM (Javas Virtuella Maskin)

<Insert Picture Here> Snabbare Java

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

OOP Objekt-orienterad programmering

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Inledande programmering med C# (1DV402) Introduktion till C#

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Föreläsnings 9 - Exceptions, I/O

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Att använda Java SE JDK 6

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Kompilera och exekvera Javakod

Chapter 4: Writing Classes/ Att skriva egna klasser.

Föreläsning 8: Exempel och problemlösning

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 1 Datastrukturer (DAT037)

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 2. Länkad lista och iterator

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

Att skriva till och läsa från terminalfönstret

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Programvaruteknik. Programspråk. Skriptspråk. Inkapsling OOP. Abstraktion. Typsystem. Parallellism. Dynamisk typning. Concurrency

Föreläsning 3. Stack

Introduktion till Java

Dugga i Grundläggande programmering STS, åk

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

12 Metaprogrammering i Java

Föreläsning 6: Metoder och fält (arrays)

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Föreläsning 2. Länkad lista och iterator

Grundläggande programmering DVG A08 & ISG A04. Allmän information. Å vem är jag då. Karlstads Universitet, Johan Öfverberg 1

Tentamen Nätverksprogrammering Lösningsförslag

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

OOP F1:1. Föreläsning 1. Introduktion till kursen OOP Vad är Java? Ett första Java-program Variabler Tilldelning. Marie Olsson

Classes och Interfaces, Objects och References, Initialization

Tentamen. Lösningsförslag

Objektorienterad programmering i Java

F4. programmeringsteknik och Matlab

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Reguljära uttryck. Reguljära uttryck. Nu kommer en siffra78 och en till SIFFRA(78) men utan 7kstuga SIFFRA(89)

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

TDDC77 Objektorienterad Programmering

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Programmeringsteknik och Matlab. Dagens program. Viktiga datum. Repetitionsexempel. Repetition av if/else, for, while och Scanner

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Föreläsning 3. Stack

Föreläsning 14. Filhantering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Tentamen FYTA11 Javaprogrammering

Programmering för språkteknologer II, HT2011. Rum

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Laboration 10 - NetBeans

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Det finns många flaggor till g++,

Tentamen OOP

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

JAVA Mer om klasser och objektorientering

TDDD78 Viktiga begrepp, del 2

Att använda Java SE JDK 6

TENTAMEN OOP

F1 - Introduktion. ID1004 Objektorienterad programmering Fredrik Kilander

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Laboration 10 - Eclipse

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Tentamen , Introduktion till Java, dtaa98, dtea53

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Recitation 4. 2-D arrays. Exceptions

Tentamen, EDA501 Programmering M L TM W K V

Datastrukturer. föreläsning 3. Stacks 1

Hämta data mha URLer Föreläsning 2b. Innehåll Klassen URL

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Föreläsning 12: Exempel och problemlösning

Generisk klass med typparameter Inre klass - ListIterator

Felhantering. Andra brott mot språkets regler. Man kan också i programmet bryta mot ett antal olika regler som gäller. Exempelvis:

DAT043 - föreläsning 8

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Föreläsning 8 - del 1: Objektorienterad programmering (forts.) - Exempel

JAVAUTVECKLING LEKTION 7

Transkript:

Föreläsning 22 Tobias Wrigstad Under huven på JVM. Bytekod. JIT. Reflection. Profiling.

Vad innehåller en.class-fil? ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count];

Vad innehåller en.class-fil? ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count];

JVM:en är en stackmaskin En stack med varvat data och operationer public class Greeter { public Greeter(String s) { new Greeter( Hello ) Varje operation pushar eller poppar något från stacken Exempel: konstruera ett nytt objekt new Greeter // klasser, konstanter, etc. är index in i konstantpoolen dup ldc Hello invokespecial En virtuell maskin har en väldigt enkel struktur Datastruktur som representerar stacken En loop som läser maskininstruktionen från toppen av stacken, utför den, poppar vad den behöver och pushar nya instruktioner som resultat

Inspektera en.class-file [Hello.class] public class Hello { public void greet(string s) { System.out.println("Hello, " + s + "!");

Inspektera en.class-file [javap -c Hello] Ändrat i och med Java 9 (Ändras igen i Java 12) Compiled from "Hello.java" public class Hello { Hello(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/object."<init>":()v 4: return public void greet(java.lang.string); Code: 0: getstatic #2 // Field java/lang/system.out:ljava/io/printstream; 3: new #3 // class java/lang/stringbuilder 6: dup 7: invokespecial #4 // Method StringBuilder."<init>":()V 10: ldc #5 // String Hello, 12: invokevirtual #6 // Method StringBuilder.append:(LString;)LStringBuilder; 15: aload_1 16: invokevirtual #6 // Method StringBuilder.append:(LString;)LStringBuilder; 19: ldc #7 // String! 21: invokevirtual #6 // Method StringBuilder.append:(LString;)LStringBuilder; 24: invokevirtual #8 // Method StringBuilder.toString:()LString; 27: invokevirtual #9 // Method PrintStream.println:(LString;)V 30: return

Inspektera en.class-file [Hello.class] OBS! Gällde till September 2017 public class Hello { public void greet(string s) { StringBuilder sb = new StringBuilder(); sb.append( Hello, ); sb.append(s); sb.append(! ); System.out.println(sb.toString()); public class Hello { public void greet(string s) { System.out.println( new StringBuilder().append("Hello, ).append(s).append("!").tostring() );

Compiled from "Hello.java" public class Hello { public Hello(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/object."<init>":()v 4: return OBS! Gällde till September 2017 public void greet(java.lang.string); Code: 0: new #2 // class java/lang/stringbuilder 3: dup 4: invokespecial #3 // Method java/lang/stringbuilder."<init>":()v 7: astore_2 8: aload_2 9: ldc #4 // String Hello, 11: invokevirtual #5 // Method java/lang/stringbuilder.append:(ljava/lang/string;)ljava/lang/stringbuilder; 14: pop 15: aload_2 16: aload_1 17: invokevirtual #5 // Method java/lang/stringbuilder.append:(ljava/lang/string;)ljava/lang/stringbuilder; 20: pop 21: aload_2 22: ldc #6 // String! 24: invokevirtual #5 // Method java/lang/stringbuilder.append:(ljava/lang/string;)ljava/lang/stringbuilder; 27: pop 28: getstatic #7 // Field java/lang/system.out:ljava/io/printstream; 31: aload_2 32: invokevirtual #8 // Method java/lang/stringbuilder.tostring:()ljava/lang/string; 35: invokevirtual #9 // Method java/io/printstream.println:(ljava/lang/string;)v

Compiled from "Hello.java" public class Hello { public Hello(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/object."<init>":()v 4: return OBS! Gällde till September 2017 public void greet(java.lang.string); Code: 0: getstatic #2 // Field java/lang/system.out:ljava/io/printstream; 3: new #3 // class java/lang/stringbuilder 6: dup 7: invokespecial #4 // Method java/lang/stringbuilder."<init>":()v 10: ldc #5 // String Hello, 12: invokevirtual #6 // Method java/lang/stringbuilder.append:(ljava/lang/string;)ljava/lang/stringbuilder; 15: aload_1 16: invokevirtual #6 // Method java/lang/stringbuilder.append:(ljava/lang/string;)ljava/lang/stringbuilder; 19: ldc #7 // String! 21: invokevirtual #6 // Method java/lang/stringbuilder.append:(ljava/lang/string;)ljava/lang/stringbuilder; 24: invokevirtual #8 // Method java/lang/stringbuilder.tostring:()ljava/lang/string; 27: invokevirtual #9 // Method java/io/printstream.println:(ljava/lang/string;)v 30: return

Inspektera en.class-file [javap -c Hello] Ändrat i och med Java 9 (Ändras igen i Java 12) Compiled from "Hello.java" public class Hello { public Hello(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/object."<init>":()v 4: return public void greet(java.lang.string); Code: 0: getstatic #2 // Field java/lang/system.out:ljava/io/printstream; 3: aload_1 4: invokedynamic #3, 0 // InvokeDynamic #0:makeConcatWithConstants:(String;)String; 9: invokevirtual #4 // Method java/io/printstream.println:(ljava/lang/string;)v 12: return

Reflection Ett program som har möjlighet att inspektera sig självt Kraftfullt framförallt i dynamiska programspråk Java stöd är begränsat Kan skapa klasser, anropa metoder, etc. Kan inte på ett enkelt sätt Ändra en metod/ta bort en metod/skapa en ny klass, etc. Bättre stöd för introspection, dvs. att manipulera det som redan finns

import java.lang.reflect.*; public class ReflectionDemo { public static void main(string[] args) throws Exception { if (args.length!= 3) { System.out.println("Usage: java ReflectionDemo ClassName MethodName string"); return; Class c = Class.forName(args[0]); Object o = c.newinstance(); Method m = c.getmethod(args[1], new Class[] {String.class); m.invoke(o, args[2]); public class Hello { public void greet(string s) { System.out.println("Hello, " + s + "!"); $ java ReflectionDemo Hello greet Tobias Hello, Tobias

import java.lang.reflect.*; public class TUnit { public static void main(string[] args) throws Exception { if (args.length < 1) { System.out.println("Usage: java TUnit TestClass1... "); return; TUnit for (String classname : args) { Class c = Class.forName(className); Object o = c.newinstance(); Method setup = null; Method teardown = null; for (Method m : c.getmethods()) { if (m.getname().equals("setup")) setup = m; if (m.getname().equals("teardown")) teardown = m; if (setup!= null && teardown!= null) break; for (Method m : c.getmethods()) { if (m.getname().startswith("test") && m.getparametercount() == 0) { if (setup!= null) setup.invoke(o); m.invoke(o); if (teardown!= null) teardown.invoke(o);

JIT-kompilering till maskinkod Vi har beskrivit interpretatorloopen i stackmaskinen Hyfsat effektiv, men inte alls lika effektiv som maskinoptimerad kod Maskinoptimerad kod = plattformsspecifik Java är plattformsoberoende eftersom program körs i en mjukvarumaskin JIT-kompilering är ett försök att tillfredsställa båda behov Kompilera bytekod till maskinkod under körning Kompilering tar tid för att de skall bli en prestandavinst måste vi kompilera selektivt, bara kod som är het Ytterligare problem: kod laddas in efterhand som programmet körs -Xint stänger av JIT-kompilering, pröva på intensivt program för att se skillnad

JIT-kompilering till maskinkod Vi har beskrivit interpretatorloopen i stackmaskinen Hyfsat effektiv, men inte alls lika effektiv som maskinoptimerad java FibRec kod 40 1.449 s Maskinoptimerad kod = plattformsspecifik Java är plattformsoberoende eftersom program körs i en mjukvarumaskin JIT-kompilering är ett försök att tillfredsställa båda behov Kompilera bytekod till maskinkod under körning time java FibRec -Xint 40 79.775 s Kompilering tar tid för att de skall bli en prestandavinst måste vi kompilera selektivt, bara kod som är het Ytterligare problem: kod laddas in efterhand som programmet körs -Xint stänger av JIT-kompilering, pröva på intensivt program för att se skillnad

With JIT compilation turned on $ time java ReflectionDemo Hello greet "Tobias" Hello, Tobias 1,60s user 0,67s system 117% cpu 1,945 total With JIT compilation turned OFF $ time java -Xint ReflectionDemo Hello greet "Tobias" Hello, Tobias 16,93s user 0,81s system 99% cpu 17,924 total

Hur får man fram profileringsinformation från ett Java-program? JVM:en har utmärkt stöd för telemetri, kommandoradsargument vid körning java -Xprof $ java Fib 40 -Xrunprof Fib 40 Flat profile of 2,02 secs (144 total ticks): main java -Xrunhprof:help visar hjälpsidan Compiled + native Method java -Xrunhprof:cpu 97,9% 140 profilerar + 1 CPU-användande Fib.fibonacci 97,9% 140 + 1 Total compiled Thread-local ticks: 2,1% 3 Class loader Global summary of 2,02 seconds: 100,0% 144 Received ticks 0,7% 1 Compilation 2,1% 3 Class loader

Hur kan vi förbättra detta programs prestanda? Flat profile of 19.00 secs (223 total ticks): main Interpreted + native Method 1.3% 1 + 0 java.lang.abstractstringbuilder.append 1.3% 1 + 0 java.lang.string.<init> 2.6% 2 + 0 Total interpreted Compiled + native Method 51.3% 0 + 40 java.lang.abstractstringbuilder.expandcapacity 29.5% 23 + 0 java.lang.abstractstringbuilder.append 10.3% 8 + 0 java.lang.stringbuilder.tostring 6.4% 0 + 5 java.lang.string.<init> 97.4% 31 + 45 Total compiled Thread-local ticks: 65.0% 145 Blocked (of total) Flat profile of 0.01 secs (1 total ticks): DestroyJavaVM Thread-local ticks: 100.0% 1 Blocked (of total) Global summary of 19.01 seconds: 100.0% 929 Received ticks 74.6% 693 Received GC ticks 0.8% 7 Other VM operations

Typer av profilering Profiling CPU Memory Tracing Sampling Usage Allocation

Sampling vs. Profiling Sampla: mät X gånger per tidsenhet Inte komplett, men mycket tidseffektivt Profiling: stoppa in telemetri i koden som rapporterar varje användande Komplett, mycket overhead, påverkar körtid negativt Använd båda! Sampling är ofta en bättre teknik om CPU-prestanda är ditt mål

Slutord bytekod, JIT, profilering I vilken utsträckning måste man förstå JIT-kompilering och bytekod? Det beror på vad man gör men framförallt måste man förstå vad som sker under huven om man någon gång råkar ut för ett program som inte presterar bra Försök inte hjälpa JVM:en att generera bra bytekod Den är optimerad för vanliga dödligas kod Optimera aldrig utan att profilera fram vad som skall optimeras! Vad är representativ indata/omständigheter för programmet? Verifiera att en optimering inte är en falsk optimering genom att profilera igen! Undvik att optimera tills det inte är hållbart längre att inte göra det!