55
What’s New in HotSpot JVM 8 Vladimir Ivanov HotSpot JVM Compiler team Oracle Corp.

Владимир Иванов. Java 8 и JVM: что нового в HotSpot

Embed Size (px)

Citation preview

Page 1: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

1

What’s New in HotSpot JVM 8

Vladimir Ivanov HotSpot JVM Compiler team Oracle Corp.

Page 2: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

2

What is Java?

Page 3: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

3

What is Java?

§  Java –  The Language –  The Platform –  The Community

Page 4: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

4

What is Java?

§  Java –  The Language –  The Platform –  The Community

What I’ll talk about today

Page 5: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

5

What’s New in HotSpot JVM 8

§  Java 8 features support –  Project Lambda –  Nashorn JavaScript engine –  Type annotations

§ Oracle implementation-specific improvements –  won’t be backported into 7

§  PermGen removal –  will be/already backported into 7

§  numerous functional & performance enhancements

Categorization

Page 6: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

6

Page 7: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

7

Project Lambda

x -> x+1 (s,i) -> s.substring(0,i) () -> System.out.print(“x”) Predicate<String> pred = s -> s.length() < 100;

Lambda expressions in Java

Page 8: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

8

Project Lambda

Function<Integer,Integer> f = x -> x+1

compiles to

invokedynamic [ j.l.i.LambdaMetafactory.metafactory, MethodType(Function.apply), MethodHandle(lambda$0) ] ()

Lambda expressions in Java

Page 9: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

9

Project Lambda

§ Lambda expressions § Core Java API evolution

–  new API §  Streams

–  existing API «lambdafication» §  e.g. Collections API

–  default methods

Page 10: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

10

Project Lambda

public interface Iterable<T> { void forEach(Consumer<? super T> action); }

API “lambdafication”

Page 11: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

11

Project Lambda

interface I { default void m() { /* do smth */ } } class T implements I {} invokevirtual T.m()V => I.m

Default methods

interface I

void m() {…}

class T

Page 12: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

12

Project Lambda

interface I { default void m() { /* do smth */ } } class T implements I { void m() { /* do smth */ } } invokevirtual T.m()V => T.m

Default methods

interface I

void m() {…}

class T

void m() {…}

Page 13: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

13

Project Lambda

interface I { default void m() { /* do smth */ } } class T1 implements I { void m() { /* do smth */ } } class T extends T1 implements I {} invokevirtual T.m()V => T1.m

Superclass overrides superinterface

interface I

void m() {…}

class T

class T1

void m() {…}

Page 14: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

14

Project Lambda

interface I { default void m() { /* do smth */ } } interface J extends I { default void m() { /* do smth */ } } class T implements I,J {} invokevirtual T.m()V => J.m

Prefer most specific interface

interface J

void m() {…}

class T

class I

void m() {…}

Page 15: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

15

Project Lambda

interface I { default void m() { /* do smth */ } } interface J { default void m() { /* do smth */ } } class T implements I,J {} invokevirtual T.m()V => error

Conflicting defaults

interface J

void m() {…}

class T

class I

void m() {…}

Page 16: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

16

Project Lambda

interface I { static void m() { /* do smth */ } } invokestatic I.m();

Static interface methods

Page 17: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

17

Project Lambda

interface I { private ... void m() { /* do smth */ } } Not allowed in Java. Only on bytecode level.

Private interface methods

Page 18: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

18

Project Lambda

class A { A get() {} } class B extends A { B get() {} } Javac adds the following: synthetic bridge A get() { return ((B)this).get(); }

Bridge methods: Covariant overrides

Page 19: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

19

Project Lambda

§ Attempted to: –  use invokedynamic –  generate bridges by VM

§ Finally: –  continue to generate bridge methods by javac

Bridge methods: roads not taken

Page 20: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

20

Page 21: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

21

java.lang.OutOfMemoryError: PermGen space

Page 22: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

22

What was “PermGen”?

§  “Permanent” Generation § Region of Java heap for JVM Class Metadata § Representation of Java classes

–  Class hierarchy information, fields, names –  Method compilation information and bytecodes –  Vtables –  Constant pool and symbolic resolution –  Interned strings (moved out of PermGen in 7)

Page 23: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

23

Java Memory Layout with PermGen

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.6

Java Memory Layout with PermGen

Eden

Old Generation for older objects

Permanent Generation for VM metadata

Survivor Survivor

Page 24: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

24

Where did JVM Metadata go?

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.9

Where did JVM Metadata go?

Eden

Old Generation for older objects

Permanent Generation for VM metadata

Survivor SurvivorMetaspace

VMMetadata in

nativememory

Page 25: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

25

PermGen size

§ Limited to MaxPermSize – default ~64M - 85M § Contiguous with Java Heap § Once exhausted throws OutOfMemoryError “PermGen space” § Hard to predict the correct size

Page 26: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

26

Why was PermGen Eliminated?

§ Fixed size at startup – applications ran out –  -XX:MaxPermSize=…

§  Improve GC performance –  Special iterators for metadata –  Deallocate class data concurrently and not during GC pause

§ Enable future improvements –  were limited by PermGen (e.g. G1 concurrent class unloading)

Page 27: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

27

Improving GC Performance

§ During full collection, metadata to metadata pointers are not scanned –  A lot of complex code (particularly for CMS) for metadata scanning was

removed

§ Metaspace contains few pointers into the Java heap –  Pointer to java/lang/Class instance in class metadata –  A component java/lang/Class pointer in array class metadata

§ No compaction costs for metadata

Page 28: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

28

Metaspace

§ Take advantage of Java Language Specification property –  Class metadata lifetime same as their class loader’s

§ Per loader storage area – Metaspace (collectively called Metaspace) –  Linear (bump) allocation only –  No individual reclamation (except for RedefineClasses and class loading

failure) –  Not scanned by GC and not compacted –  Metaspace-allocated objects never relocate –  Reclamation en-masse when class loader found dead by GC

Page 29: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

29

Metaspace Allocation

§ Multiple mmap/VirtualAlloc virtual memory spaces § Allocate per-class loader chunk lists

–  Chunk sizes depend on type of class loader –  Smaller chunks for sun/reflect/DelegatingClassLoader, JSR292 anonymous classes

§ Return chunks to free chunk lists § Virtual memory spaces returned when emptied § Strategies to minimize fragmentation

Page 30: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

30

Metaspace Allocation

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.12

Metaspace Allocation

● Metachunks in virtual spaces (vs1, vs2, vs3...)

Boot CL

CL 3

CL 1

CL 2

vs1 vs3vs2

§ Metachunks in virtual spaces (vs1, vs2, vs3...)

Page 31: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

31

Java Object Memory Layout

class Message { String text; void add(String s) { ...} … }

Java Heap Layout

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.13

Java Object Memory Layout

class Message {

// JVM adds _mark and

//_klass pointer

String text;

void add(String s) { …}

String get() { … }

}

Java Heap Layout

_mark_klass

text

_mark_klasscountvalue

Metaspace

Klass

Klass

Page 32: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

32

Java Object Memory Layout

class Message { String text; void add(String s) { ...} … }

with compressed class pointers

Java Heap Layout

Page 33: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

33

How to tune Metaspace?

§  -XX:MaxMetaspaceSize={unlimited}

§ Limit the memory used by class metadata before excess swapping and native allocation failure occurs

–  Use if suspected class loader memory leaks –  Use if on 32-bit

Page 34: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

34

How to tune Metaspace?

§  -XX:MetaspaceSize={21M}

§ Set to a higher limit if application loads more § Possibly use same value set by PermSize to delay initial GC § High water mark increases with subsequent collections for a

reasonable amount of head room before next Metaspace GC

Page 35: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

35

How to tune Metaspace?

§  -XX:CompressedClassSpaceSize={1G} § Only valid if -XX:+UseCompressedClassPointers (default on 64 bit) § Not committed until used

Page 36: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

36

Metaspace Monitoring and Management

§ MemoryManagerMXBean with name MetaspaceManager § MemoryPoolMXBeans

–  “Metaspace” –  “Compressed Class Space”

§ $ jmap -clstats <pid> § $ jstat -gc <pid> § $ jcmd <pid> GC.class_stats §  Java Mission Control (bundled with Oracle JDK 8)

Page 37: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

37

PermGen removal

§ Hotspot metadata is now allocated in Metaspace –  Chunks in mmap spaces based on liveness of class loader

§ Compressed class pointer space is still fixed size but large § Tuning flags available but not required § Change enables other optimizations and features in the future

–  Application class data sharing –  Young collection optimizations, G1 class unloading –  Metadata size reductions and internal JVM footprint projects

Summary

Page 38: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

38

Nashorn JavaScript engine for Java Platform

Page 39: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

39

Nashorn

§ Nashorn is written completely in Java § Extensively uses JSR292 § Required numerous performance improvements

–  LambdaForms (JEP 160) –  incremental inlining –  exact math intrinsics

§  Math.addExact, Math.substractExact, etc –  improved type profiling & type speculation

JVM support for dynamic languages

Page 40: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

40

JVM support for dynamic languages

public static long addExact(long x, long y) { long r = x + y; if (((x ^ r) & (y ^ r)) < 0) {

throw new ArithmeticException("long overflow"); } return r; }

Exact Math intrinsics

Page 41: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

41

JVM support for dynamic languages

Math.addExact(l1, Integer.MAX_VALUE) Compiled version: 0x0...5d: add $0x7fffffff,%r8 0x0...64: mov %r8,%r9 0x0...67: xor %r11,%r9 0x0...6a: mov %r8,%r11 0x0...6d: xor $0x7fffffff,%r11 0x0...74: and %r11,%r9 0x0...77: test %r9,%r9 0x0...7a: jl 0x0000000102c70e95 // slow path: throw exception

Exact Math intrinsics

Page 42: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

42

JVM support for dynamic languages

Math.addExact(l1, Integer.MAX_VALUE) Intrinsified version: 0x…1d: add $0x7fffffff,%rax 0x…24: jo 0x000000010c044b3f // slow path: overflow

Exact Math intrinsics

Page 43: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

43

Smaller features

§ JSR 308: Annotations on Java Types –  new class file attributes

§ JEP 171: Fence Intrinsics –  sun.misc.Unsafe: loadFence, storeFence & fullFence

§ JEP 136: Enhanced Verification Errors –  VerifyError with detailed error message

§ JEP 142: Reduce Cache Contention on Specified Fields –  @Contended

Page 44: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

44

JSR 308: Annotations on Java Types

Map<@Interned Key, @NonNull Value> = new HashMap<>();

Page 45: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

45

JSR 308: Annotations on Java Types

§ New attributes: –  RuntimeVisibleTypeAnnotations –  RuntimeInvisibleTypeAnnotations

§ Stored on the smallest enclosing class, field, method, or Code § How to access:

–  javax.lang.model –  javax.ide –  com.sun.source.tree

Class File Attributes

Page 46: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

46

JEP 171: Fence Intrinsics

§ How to express memory model: –  happens-before relations –  memory barriers/fences

§ Happens-before in Java Memory Model (JMM) §  sun.misc.Unsafe.[load|store|full]Fence introduces memory barriers § Why:

–  some relations aren’t possible to express in JMM at the moment §  consider StoreStore

Page 47: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

47

JEP 142: Reduce Cache Contention on …

§ What is cache contention and false sharing?

–  adjacent memory accesses can produce unnecessary memory traffic on SMP systems

Page 48: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

48

JEP 142: Reduce Cache Contention on …

§ How to avoid it? –  manually “pad” contended fields

public class A { int x; int i01, i02, …, i16; int y; int i17, i18, …, i32; }

Page 49: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

49

JEP 142: Reduce Cache Contention on …

§ How to avoid it? –  mark them @Contended

public class A { int x; @Contended int y; }

Page 50: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

50

JEP 142: Reduce Cache Contention on …

§ sun.misc.Contended § How to use: -XX:-RestrictContended

–  by default, has effect only in privileged context (on boot class path)

Page 51: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

51

JEP 136: Enhanced Verification Errors Before

Exception in thread "main" java.lang.VerifyError: Bad instruction in method Test.main([Ljava/lang/String;)V at offset 0

Page 52: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

52

JEP 136: Enhanced Verification Errors Now

Exception in thread "main" java.lang.VerifyError: Bad instruction Exception Details: Location: Test.main([Ljava/lang/String;)V @0: <illegal> Reason: Error exists in the bytecode Bytecode: 0000000: ff00 0200 004c 2b04 b800 03b9 0004 0200 0000010: 57b1

Page 53: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

53

Future work

The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

Page 54: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

54

Future work

§ Value Objects in Java –   http://openjdk.java.net/jeps/169

§ Project Sumatra: Java on GPU –  http://openjdk.java.net/projects/sumatra/

§ Project Panama: Native Interconnect for Java (JNI 2.0) –  http://mail.openjdk.java.net/pipermail/discuss/2014-March/003306.html

Where does innovation take place?

Page 55: Владимир Иванов. Java 8 и JVM: что нового в HotSpot

55

Graphic Section Divider