1
What’s New in HotSpot JVM 8
Vladimir Ivanov
HotSpot JVM Compiler team
Oracle Corp.
2
What’s New in HotSpot JVM 8
§  Java 8 features support
–  Project Lambda, Nashorn, Type annotations
§  Oracle implemen...
3
4
Project Lambda
x -> x+1
(s,i) -> s.substring(0,i)
() -> System.out.print(“x”)
Predicate<String> pred = s -> s.length() <...
5
Project Lambda
Function<Integer,Integer> f = x -> x+1
compiles to
invokedynamic [ j.l.i.LambdaMetafactory.metafactory,
M...
6
Project Lambda
interface I {
default void m() { /* do smth */ }
}
class T implements I {}
invokevirtual T.m()V => ?
Defa...
7
Project Lambda
interface I {
default void m() { /* do smth */ }
}
class T implements I {
void m() { /* do smth */ }
}
in...
8
Project Lambda
interface I {
default void m() { /* do smth */ }
}
class T1 implements I {
void m() { /* do smth */ }
}
c...
9
Project Lambda
interface I {
default void m() { /* do smth */ }
}
interface J extends I {
default void m() { /* do smth ...
10
Project Lambda
interface I {
default void m() { /* do smth */ }
}
interface J {
default void m() { /* do smth */ }
}
cl...
11
Project Lambda
interface I {
static void m() { /* do smth */ }
}
invokestatic I.m();
Static interface methods
12
Project Lambda
interface I {
private ... void m() { /* do smth */ }
}
Not allowed in Java.
Only on bytecode level.
Priv...
13
Project Lambda
class A { A get() {} }
class B extends A { B get() {} }
Javac adds the following:
synthetic bridge A get...
14
Project Lambda
§  Attempted to:
–  use invokedynamic
–  generate bridges by VM
§  Finally:
–  continue to generate br...
15
16
java.lang.OutOfMemoryError: PermGen space
17
What was “PermGen”?
§  “Permanent” Generation
§  Region of Java heap for JVM Class Metadata
§  Representation of Jav...
18
Java Memory Layout with PermGen
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.6
Java Memory Layou...
19
Where did JVM Metadata go?
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.9
Where did JVM Metadata...
20
PermGen size
§  Limited to MaxPermSize – default ~64M - 85M
§  Contiguous with Java Heap
–  Identifying young referen...
21
Why was PermGen Eliminated?
§  Fixed size at startup – applications ran out
–  -XX:MaxPermSize=… was hard to size
§  ...
22
Improving GC Performance
§  During full collection, metadata to metadata pointers are not scanned
–  A lot of complex ...
23
Metaspace
§  Take advantage of Java Language Specification property
–  Class metadata lifetime same as their class loa...
24
Metaspace Allocation
§  Multiple mmap/VirtualAlloc virtual memory spaces
§  Allocate per-class loader chunk lists
–  ...
25
Metaspace Allocation
Copyright © 2013, Oracle and/or its affiliates. All rights reserved.12
Metaspace Allocation
● Meta...
26
Java Object Memory Layout
class Message {
String text;
void add(String s) { ...}
…
}
Java Heap Layout
Copyright © 2013,...
27
Java Object Memory Layout
class Message {
String text;
void add(String s) { ...}
…
}
with compressed class pointers
Jav...
28
How to tune Metaspace?
§  -XX:MaxMetaspaceSize={unlimited}
§  Limit the memory used by class metadata before excess s...
29
How to tune Metaspace?
§  -XX:MetaspaceSize={21M}
§  Set to a higher limit if application loads more
§  Possibly use...
30
How to tune Metaspace?
§  -XX:CompressedClassSpaceSize={1G}
§  Only valid if -XX:+UseCompressedClassPointers (default...
31
Metaspace Monitoring and Management
§  MemoryManagerMXBean with name MetaspaceManager
§  MemoryPoolMXBeans
–  “Metasp...
32
PermGen removal
§  Hotspot metadata is now allocated in Metaspace
–  Chunks in mmap spaces based on liveness of class ...
33
Nashorn
JavaScript engine for Java Platform
34
Nashorn
§  Nashorn is written completely in Java
§  Extensively uses JSR292
§  Required numerous performance improve...
35
JVM support for dynamic languages
public static long addExact(long x, long y) {
long r = x + y;
if (((x ^ r) & (y ^ r))...
36
JVM support for dynamic languages
Math.addExact(l1, Integer.MAX_VALUE)
Compiled version:
0x0...5d: add $0x7fffffff,%r8
...
37
JVM support for dynamic languages
Math.addExact(l1, Integer.MAX_VALUE)
Intrinsified version:
0x…1d: add $0x7fffffff,%ra...
38
Smaller features
§  JSR 308: Annotations on Java Types
–  new class file attributes
§  JEP 171: Fence Intrinsics
–  s...
39
JSR 308: Annotations on Java Types
Map<@Interned Key, @NonNull Value> = new HashMap<>();
40
JSR 308: Annotations on Java Types
§  New attributes:
–  RuntimeVisibleTypeAnnotations
–  RuntimeInvisibleTypeAnnotati...
41
JEP 171: Fence Intrinsics
§  How to express memory model:
–  happens-before relations
–  memory barriers/fences
§  Ha...
42
JEP 142: Reduce Cache Contention on …
§  What is cache contention and false
sharing?
–  adjacent memory accesses can p...
43
JEP 142: Reduce Cache Contention on …
§  How to avoid it?
–  manually “pad” contended fields
public class A {
int x;
i...
44
JEP 142: Reduce Cache Contention on …
§  How to avoid it?
–  mark them @Contended
public class A {
int x;
@Contended i...
45
JEP 142: Reduce Cache Contention on …
§  sun.misc.Contended
§  How to use: -XX:-RestrictContended
–  by default, has ...
46
JEP 136: Enhanced Verification Errors
Before
Exception in thread "main" java.lang.VerifyError:
Bad instruction in metho...
47
JEP 136: Enhanced Verification Errors
Now
Exception in thread "main" java.lang.VerifyError: Bad instruction
Exception D...
48
Graphic Section Divider
Upcoming SlideShare
Loading in …5
×

"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia

4,389 views

Published on

Published in: Technology, Education
2 Comments
12 Likes
Statistics
Notes
No Downloads
Views
Total views
4,389
On SlideShare
0
From Embeds
0
Number of Embeds
321
Actions
Shares
0
Downloads
73
Comments
2
Likes
12
Embeds 0
No embeds

No notes for slide

"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia

  1. 1. 1 What’s New in HotSpot JVM 8 Vladimir Ivanov HotSpot JVM Compiler team Oracle Corp.
  2. 2. 2 What’s New in HotSpot JVM 8 §  Java 8 features support –  Project Lambda, Nashorn, 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
  3. 3. 3
  4. 4. 4 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
  5. 5. 5 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
  6. 6. 6 Project Lambda interface I { default void m() { /* do smth */ } } class T implements I {} invokevirtual T.m()V => ? Default methods interface I void m() {…} class T
  7. 7. 7 Project Lambda interface I { default void m() { /* do smth */ } } class T implements I { void m() { /* do smth */ } } invokevirtual T.m()V => ? Default methods interface I void m() {…} class T void m() {…}
  8. 8. 8 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 => ? Superclass overrides superinterface interface I void m() {…} class T class T1 void m() {…}
  9. 9. 9 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 => ? Prefer most specific interface interface J void m() {…} class T class I void m() {…}
  10. 10. 10 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 => ? Conflicting defaults interface J void m() {…} class T class I void m() {…}
  11. 11. 11 Project Lambda interface I { static void m() { /* do smth */ } } invokestatic I.m(); Static interface methods
  12. 12. 12 Project Lambda interface I { private ... void m() { /* do smth */ } } Not allowed in Java. Only on bytecode level. Private interface methods
  13. 13. 13 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
  14. 14. 14 Project Lambda §  Attempted to: –  use invokedynamic –  generate bridges by VM §  Finally: –  continue to generate bridge methods by javac Bridge methods: roads not taken
  15. 15. 15
  16. 16. 16 java.lang.OutOfMemoryError: PermGen space
  17. 17. 17 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)
  18. 18. 18 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
  19. 19. 19 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 Survivor Metaspace VM Metadata in native memory
  20. 20. 20 PermGen size §  Limited to MaxPermSize – default ~64M - 85M §  Contiguous with Java Heap –  Identifying young references from old gen and permgen would be more expensive and complicated with a non-contiguous heap – card table §  Once exhausted throws OutOfMemoryError “PermGen space” –  Application could clear references to cause class unloading –  Restart with larger MaxPermSize §  Hard to predict –  Size needed depends on number of classes, size of methods, size of constant pools, etc
  21. 21. 21 Why was PermGen Eliminated? §  Fixed size at startup – applications ran out –  -XX:MaxPermSize=… was hard to size §  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)
  22. 22. 22 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
  23. 23. 23 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
  24. 24. 24 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
  25. 25. 25 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...)
  26. 26. 26 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 _klass count value Metaspace Klass Klass
  27. 27. 27 Java Object Memory Layout class Message { String text; void add(String s) { ...} … } with compressed class pointers Java Heap Layout
  28. 28. 28 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
  29. 29. 29 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
  30. 30. 30 How to tune Metaspace? §  -XX:CompressedClassSpaceSize={1G} §  Only valid if -XX:+UseCompressedClassPointers (default on 64 bit) §  Not committed until used
  31. 31. 31 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)
  32. 32. 32 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
  33. 33. 33 Nashorn JavaScript engine for Java Platform
  34. 34. 34 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
  35. 35. 35 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
  36. 36. 36 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
  37. 37. 37 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
  38. 38. 38 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
  39. 39. 39 JSR 308: Annotations on Java Types Map<@Interned Key, @NonNull Value> = new HashMap<>();
  40. 40. 40 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
  41. 41. 41 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
  42. 42. 42 JEP 142: Reduce Cache Contention on … §  What is cache contention and false sharing? –  adjacent memory accesses can produce unnecessary memory traffic on SMP systems
  43. 43. 43 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; }
  44. 44. 44 JEP 142: Reduce Cache Contention on … §  How to avoid it? –  mark them @Contended public class A { int x; @Contended int y; }
  45. 45. 45 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)
  46. 46. 46 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
  47. 47. 47 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
  48. 48. 48 Graphic Section Divider

×