Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

A Post-Apocalyptic sun.misc.Unsafe World

3,320 views

Published on

The future of Java is insight with Java 9 around the corner. Last year's discussions around the removal from sun.misc.Unsafe and the eventually presented compromise is history. Time to start looking forward to some details from what's coming, especially in terms of the Unsafe API replacement.

Published in: Software

A Post-Apocalyptic sun.misc.Unsafe World

  1. 1. http://www.superbwallpapers.com/fantasy/post-apocalyptic-tower-bridge-london-26546/ A Post-Apocalyptic sun.misc.Unsafe World
  2. 2. www.hazelcast.com@noctarius2k Disclaimer This talk is not going to be negative!
  3. 3. www.hazelcast.com@noctarius2k Who’s that dude? • Chris Engelbert • Manager of Developer Relations @Hazelcast • Java-Passionate (10+ years) • Performance • Garbage Collection • Benchmark Fairytales
  4. 4. www.hazelcast.com@noctarius2k sun.misc.Unsafe?
  5. 5. www.hazelcast.com@noctarius2k sun.misc.Unsafe? dangerous low level discourage performance platform specific pointers UNSAFE
  6. 6. www.hazelcast.com@noctarius2k sun.misc.Scissors
  7. 7. www.hazelcast.com@noctarius2k “My precious.”
  8. 8. www.hazelcast.com@noctarius2k “My precious.”The Lord of the Rings
  9. 9. www.hazelcast.com@noctarius2k Internal Class of the JDK
  10. 10. www.hazelcast.com@noctarius2k Internal Class of the JDK and those are not intended for outside use :)
  11. 11. www.hazelcast.com@noctarius2k Used inside and outside the JDK / JRE custom (64-bit) memory allocation fast memory access fast (de)serialization minimizegc overhead custom memory fences efficientmemory layout (array element) volatile semantics
  12. 12. www.hazelcast.com@noctarius2k Used inside and outside the JDK / JRE // Unsafe mechanics
 private static final sun.misc.Unsafe U;
 private static final long QBASE;
 private static final long QLOCK;
 private static final int ABASE;
 private static final int ASHIFT;
 static {
 try {
 U = sun.misc.Unsafe.getUnsafe();
 Class<?> k = WorkQueue.class;
 Class<?> ak = ForkJoinTask[].class;
 QBASE = U.objectFieldOffset
 (k.getDeclaredField("base"));
 QLOCK = U.objectFieldOffset
 (k.getDeclaredField("qlock"));
 ABASE = U.arrayBaseOffset(ak);
 int scale = U.arrayIndexScale(ak);
 if ((scale & (scale - 1)) != 0)
 throw new Error("data type scale not a power of two");
 ASHIFT = 31 - Integer.numberOfLeadingZeros(scale);
 } catch (Exception e) {
 throw new Error(e);
 }
 }
 } example: java.util.concurrent.ForkJoinPool
  13. 13. www.hazelcast.com@noctarius2k “I’m the kind of the world!”
  14. 14. www.hazelcast.com@noctarius2k “I’m the kind of the world!”Titanic
  15. 15. www.hazelcast.com@noctarius2k Used inside and outside the JDK / JRE
  16. 16. www.hazelcast.com@noctarius2k Used inside and outside the JDK / JRE
  17. 17. www.hazelcast.com@noctarius2k # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00000001067314b5, pid=25244, tid=5891 # # JRE version: Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05-b13) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.5-b02 mixed mode bsd-amd64 compressed oops) # Problematic frame: # V [libjvm.dylib+0x5314b5] Unsafe_SetNativeAddress+0x36 # # An error report file with more information is saved as: # /Users/noctarius/git/hazelcast-only.idea/hs_err_pid25244.log # # If you would like to submit a bug report, please visit: # http://bugreport.sun.com/bugreport/crash.jsp #
  18. 18. www.hazelcast.com@noctarius2k
  19. 19. www.hazelcast.com@noctarius2k “Supercalifragilisticexpialidocious!”
  20. 20. www.hazelcast.com@noctarius2k “Supercalifragilisticexpialidocious!”Mary Poppins
  21. 21. www.hazelcast.com@noctarius2k Used inside and outside the JDK / JRE MapDB Netty Hazelcast Cassandra Mockito EasyMock JMock Scala Robolectric Grails GsonNeo4j Apache Ignite Apache Spark Apache Kafka Apache Storm Apache Continuum Zookeeper Dropwizard Kryo Byte Buddy Hibernate Liquibase Spring Framework Ehcache OrientDB Chronicle Apache Hadoop Apache HBase GWT Disruptor JRubyAkka Agrona Aeron Simple Binary Encoding XRebel Presto jol LWJGL XAP XStream CapLogic WildFly Infinispan
  22. 22. www.hazelcast.com@noctarius2k Used inside and outside the JDK / JRE MapDB Netty Hazelcast Cassandra Mockito EasyMock JMock Scala Robolectric Grails GsonNeo4j Apache Ignite Apache Spark Apache Kafka Apache Storm Apache Continuum Zookeeper Dropwizard Kryo Byte Buddy Hibernate Liquibase Spring Framework Ehcache OrientDB Chronicle Apache Hadoop Apache HBase GWT Disruptor JRubyAkka Agrona Aeron Simple Binary Encoding XRebel Presto jol LWJGL XAP XStream CapLogic WildFly Infinispan
  23. 23. www.hazelcast.com@noctarius2k Used inside and outside the JDK / JRE MapDB Netty Hazelcast Cassandra Mockito EasyMock JMock Scala Robolectric Grails GsonNeo4j Apache Ignite Apache Spark Apache Kafka Apache Storm Apache Continuum Zookeeper Dropwizard Kryo Byte Buddy Hibernate Liquibase Spring Framework Ehcache OrientDB Chronicle Apache Hadoop Apache HBase GWT Disruptor JRubyAkka Agrona Aeron Simple Binary Encoding XRebel Presto jol LWJGL XAP XStream CapLogic WildFly Infinispan
  24. 24. www.hazelcast.com@noctarius2k Hazelcast Use Cases
  25. 25. www.hazelcast.com@noctarius2k Hazelcast Use Cases
  26. 26. www.hazelcast.com@noctarius2k Hazelcast Use Cases custom (64-bit) memory allocation fast memory access fast (de)serialization minimize gc overhead custom memory fences efficientmemory layout (array element) volatile semantics
  27. 27. www.hazelcast.com@noctarius2k “There’s no place like home.”
  28. 28. www.hazelcast.com@noctarius2k “There’s no place like home.”The Wizard of Oz
  29. 29. www.hazelcast.com@noctarius2k
  30. 30. www.hazelcast.com@noctarius2k Close ;-) Language URL sun.misc.Unsafe Avian C++ https://github.com/ReadyTalk/avian Yes BicaVM JavaScript https://github.com/nurv/BicaVM No Cacao C http://www.cacaojvm.org Yes Excelsior JVM C / C++ ? http://www.excelsiorjet.com Yes Dalvik / ART / Android C / C++ https://source.android.com/source/index.html Yes Graal mainly Java http://openjdk.java.net/projects/graal Yes GCJ C / C++ https://gcc.gnu.org/java Yes HaikuVM C http://haiku-vm.sourceforge.net No IBM J9 C / C++ ? http://www.ibm.com/developerworks/java/jdk/index.html Yes IcedTea C / C++ http://icedtea.classpath.org/wiki/Main_Page Yes IKVM.NET C# http://www.ikvm.net Yes Jamiga C https://sourceforge.net/projects/jamiga2 No JamVM C http://jamvm.sourceforge.net Yes JatoVM C http://jatovm.org Yes JikesRVM C microkernel, Java http://www.jikesrvm.org Yes JNode C microkernel, Java http://www.jnode.org Yes JVM.go Go https://github.com/zxh0/jvm.go Yes JX C http://www4.cs.fau.de/Projects/JX/index.html No Kaffe C https://github.com/kaffe/kaffe Yes NanoVM C http://harbaum.org/till/nanovm/index.shtml No OpenJDK / Oracle / Zulu C / C++ http://openjdk.java.net Yes RoboVM C / C++ / ObjC https://robovm.com Yes SAPJVM C / C++ ? http://help.sap.com/saphelp_nwce10/helpdata/en/47/ dc90b4ef17452289f9128b8c2bbd77/content.htm Yes Waratek Multitenant JVM C / C++ ? http://www.waratek.com Yes Zing JVM C / C++ ? https://www.azul.com/products/zing Yes
  31. 31. www.hazelcast.com@noctarius2k “To infinity and beyond!”
  32. 32. www.hazelcast.com@noctarius2k “To infinity and beyond!”Toy Story
  33. 33. www.hazelcast.com@noctarius2k http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-April/017028.html Let me be blunt -- sun.misc.Unsafe must die in a fire. It is -- wait for it -- Unsafe. It must go. Ignore any kind of theoretical rope and start the path to righteousness _*/now/*_. It is still years until the end of public updates to JDK 8, so we have /*years */to work this out properly. But sticking our heads in the collective sands and hoping for trivial work arounds to Unsafe is not going to work. If you're using Unsafe, this is the year to explain where the API is broken and get it straight.... Please help us kill Unsafe, kill Unsafe dead, kill Unsafe right, and do so as quickly as possible to the ultimate benefit of everyone. Wed Apr 8 19:15:42 UTC 2015, OpenJFX Mailinglist, Donald Smith, Oracle
  34. 34. www.hazelcast.com@noctarius2k http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-April/017028.html Let me be blunt -- sun.misc.Unsafe must die in a fire. It is -- wait for it -- Unsafe. It must go. Ignore any kind of theoretical rope and start the path to righteousness _*/now/*_. It is still years until the end of public updates to JDK 8, so we have /*years */to work this out properly. But sticking our heads in the collective sands and hoping for trivial work arounds to Unsafe is not going to work. If you're using Unsafe, this is the year to explain where the API is broken and get it straight.... Please help us kill Unsafe, kill Unsafe dead, kill Unsafe right, and do so as quickly as possible to the ultimate benefit of everyone. Wed Apr 8 19:15:42 UTC 2015, OpenJFX Mailinglist, Donald Smith, Oracle
  35. 35. www.hazelcast.com@noctarius2k Oracle created a new Taskforce
  36. 36. www.hazelcast.com@noctarius2k Oracle created a new Taskforce K.U.T.T. - Kill Unsafe To Total death
  37. 37. www.hazelcast.com@noctarius2k http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-April/017028.html Let me be blunt -- sun.misc.Unsafe must die in a fire. It is -- wait for it -- Unsafe. It must go. Ignore any kind of theoretical rope and start the path to righteousness _*/now/*_. It is still years until the end of public updates to JDK 8, so we have /*years */to work this out properly. But sticking our heads in the collective sands and hoping for trivial work arounds to Unsafe is not going to work. If you're using Unsafe, this is the year to explain where the API is broken and get it straight.... Please help us kill Unsafe, kill Unsafe dead, kill Unsafe right, and do so as quickly as possible to the ultimate benefit of everyone. Wed Apr 8 19:15:42 UTC 2015, OpenJFX Mailinglist, Donald Smith, Oracle
  38. 38. www.hazelcast.com@noctarius2k https://docs.google.com/document/d/1GDm_cAxYInmoHMor-AkStzWvwE9pw6tnz_CebJQxuUE Hazelcast jClarity Azul Systems Higher Frequency Trading Rafael Winterhalter Richard Warburton and many others…
  39. 39. www.hazelcast.com@noctarius2k
  40. 40. www.hazelcast.com@noctarius2k
  41. 41. www.hazelcast.com@noctarius2k
  42. 42. www.hazelcast.com@noctarius2k Mutation: it is the key to our evolution.
  43. 43. www.hazelcast.com@noctarius2k Mutation: it is the key to our evolution. X-Men
  44. 44. www.hazelcast.com@noctarius2k Problem 1: Get Access
  45. 45. www.hazelcast.com@noctarius2k Problem 1: Get Access Unsafe unsafe = Unsafe.getUnsafe(); Easy One (not working outside the JRE / JDK)
  46. 46. www.hazelcast.com@noctarius2k Problem 1: Get Access private static final Unsafe UNSAFE;
 static {
 try {
 Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
 theUnsafeField.setAccessible(true);
 UNSAFE = (Unsafe) theUnsafeField.get(Unsafe.class);
 
 } catch (Exception e) {
 // We need you! =(
 throw new Error(e);
 }
 } The Ugly One
  47. 47. www.hazelcast.com@noctarius2k Problem 1: Get Accessprivate static Unsafe findUnsafe() {
 try {
 return Unsafe.getUnsafe();
 } catch (SecurityException se) {
 return AccessController.doPrivileged(new PrivilegedAction<Unsafe>() {
 @Override
 public Unsafe run() {
 try {
 Class<Unsafe> type = Unsafe.class;
 try {
 Field field = type.getDeclaredField("theUnsafe");
 field.setAccessible(true);
 return type.cast(field.get(type));
 
 } catch (Exception e) {
 for (Field field : type.getDeclaredFields()) {
 if (type.isAssignableFrom(field.getType())) {
 field.setAccessible(true);
 return type.cast(field.get(type));
 }
 }
 }
 } catch (Exception e) {
 throw new RuntimeException("Unsafe unavailable", e);
 }
 throw new RuntimeException("Unsafe unavailable");
 }
 });
 }
 } The Hazelcast One (also working in most other JVMs)
  48. 48. www.hazelcast.com@noctarius2k Problem 1: Get Access The Tricky One private static final Unsafe UNSAFE;
 static {
 try {
 Constructor<Unsafe> constructor = Unsafe.class.getDeclaredConstructor(); 
 constructor.setAccessible(true);
 UNSAFE = constructor.newInstance();
 
 } catch (Exception e) {
 // We need you! =(
 throw new Error(e);
 }
 }
  49. 49. www.hazelcast.com@noctarius2k Problem 1: Get Access The Tricky One private static final Unsafe UNSAFE;
 static {
 try {
 Constructor<Unsafe> constructor = Unsafe.class.getDeclaredConstructor(); 
 constructor.setAccessible(true);
 UNSAFE = constructor.newInstance();
 
 } catch (Exception e) {
 // We need you! =(
 throw new Error(e);
 }
 }
  50. 50. www.hazelcast.com@noctarius2k Problem 1: Get Access Does Any Of This Feel Right?
  51. 51. www.hazelcast.com@noctarius2k Problem 1: Get Access Weird! No!
  52. 52. www.hazelcast.com@noctarius2k Problem 1: Get Access WAAAAAT!?!? No!
  53. 53. www.hazelcast.com@noctarius2k Solution 1: Get Access
  54. 54. www.hazelcast.com@noctarius2k Solution 1: Get Access Nothing; not needed anymore!
  55. 55. www.hazelcast.com@noctarius2k Problem 2: Atomic Updates private static final Unsafe UNSAFE = findUnsafe(); private static long VERSION_OFFSET = findVersionOffset(); // Updated through Unsafe only! private volatile long version = 0; public long increment() { while(true) { long version = this.version; long newVersion = version + 1; if (UNSAFE.compareAndSwapLong( this, VERSION_OFFSET, version, newVersion)) { return newVersion; } } } Going Unsafe
  56. 56. www.hazelcast.com@noctarius2k Problem 2: Atomic Updates We can do better! There’s an API already!
  57. 57. www.hazelcast.com@noctarius2k Problem 2: Atomic Updates private final AtomicLong version = new AtomicLong(0); public long increment() { return version.incrementAndGet(); } We can do better! There’s an API already! But one AtomicLong instance per version
  58. 58. www.hazelcast.com@noctarius2k Problem 2: Atomic Updates We can still do better! There’s yet another API already!
  59. 59. www.hazelcast.com@noctarius2k Problem 2: Atomic Updates We can still do better! There’s yet another API already! private static final AtomicLongFieldUpdater<Record> VERSION =
 AtomicLongFieldUpdater.newUpdater(Record, "version");
 // Updated through atomic field updater only!
 private volatile long version = 0;
 
 public long increment() {
 return VERSION.incrementAndGet(this);
 }
  60. 60. www.hazelcast.com@noctarius2k Solution 2: Atomic Updates We can still do better! There’s yet another API already! private static final AtomicLongFieldUpdater<Record> VERSION =
 AtomicLongFieldUpdater.newUpdater(Record, "version");
 // Updated through atomic field updater only!
 private volatile long version = 0;
 
 public long increment() {
 return VERSION.incrementAndGet(this);
 } You guessed it, __ uses it ;-)
  61. 61. www.hazelcast.com@noctarius2k Solution 2: Atomic Updates private static final VarHandle VERSION = findVersionVarHandle();
 
 // Updated through VarHandle only!
 private volatile long version = 0;
 
 public long increment() {
 return (long) VERSION.addAndGet(this, 1);
 } JVM can inline those calls
  62. 62. www.hazelcast.com@noctarius2k Solution 2: Atomic Updates public static VarHandle findVersionVarHandle() {
 try {
 return MethodHandles.lookup().
 findFieldVarHandle(Record.class, "version", long.class);
 
 } catch (Exception e) {
 throw new Error(e);
 }
 } Statically cache the VarHandle instance
  63. 63. www.hazelcast.com@noctarius2k Problem 3: Memory Management public long memory() {
 long address = UNSAFE.allocateMemory(8); 
 UNSAFE.putLong(address, Long.MAX_VALUE); 
 return UNSAFE.getLong(address);
 } Keyword: Off-Heap
  64. 64. www.hazelcast.com@noctarius2k Problem 3: Memory Management ByteBuffer possible; API is 32bit though public long memory() {
 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(8);
 
 byteBuffer.putLong(0, Long.MAX_VALUE);
 
 return byteBuffer.getLong(0);
 }
  65. 65. www.hazelcast.com@noctarius2k Solution 3: Memory Management public long memory() {
 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(8);
 
 VarHandle bufferView =
 MethodHandles.byteBufferViewVarHandle(long[].class, true);
 
 bufferView.set(byteBuffer, 0, Long.MAX_VALUE);
 
 return bufferView.get(byteBuffer, 0);
 } Simplifies off-heap implementations,
 empowers new ideas
  66. 66. www.hazelcast.com@noctarius2k Solution 3.5: Memory Management Even easier to build a great off-heap public long memory(long index) {
 try (Scope scope = new NativeScope()) {
 Pointer<Long> ptr = scope.allocate(
 NativeLibrary.createLayout(long.class), numElements);
 
 Reference<Long> ref = ptr.offset(index).deref();
 
 ref.set(Long.MAX_VALUE);
 
 return ref.get();
 }
 }
  67. 67. www.hazelcast.com@noctarius2k Problem 4: Serialization private static final Unsafe UNSAFE = findUnsafe();
 
 private static final long VALUE_OFFSET = findValueOffset();
 
 public String deserializeString() throws Exception {
 char[] chars = magicallyDecodeUTF8FromStream();
 String allocated = (String) UNSAFE.allocateInstance(String.class);
 UNSAFE.putObjectVolatile(allocated, VALUE_OFFSET, chars);
 return allocated;
 }
  68. 68. www.hazelcast.com@noctarius2k Problem 4: Serialization private static final Unsafe UNSAFE = findUnsafe();
 
 private static final long VALUE_OFFSET = findValueOffset();
 
 public String deserializeString() throws Exception {
 char[] chars = magicallyDecodeUTF8FromStream();
 String allocated = (String) UNSAFE.allocateInstance(String.class);
 UNSAFE.putObjectVolatile(allocated, VALUE_OFFSET, chars);
 return allocated;
 } Will break in Java 9 (compressed Strings)
  69. 69. www.hazelcast.com@noctarius2k Solution 4: Serialization public String deserializeString() throws Exception {
 char[] chars = magicallyDecodeUTF8FromStream();
 
 ReflectionFactory reflectionFactory =
 ReflectionFactory.getReflectionFactory();
 
 Constructor<String> constructor = reflectionFactory
 .newConstructorForSerialization(String.class, char[].class);
 
 return constructor.newInstance(chars);
 } sun.reflect.ReflectionFactory -> java.lang.reflect.ReflectionFactory (or similar)
  70. 70. www.hazelcast.com@noctarius2k Problem 5: Native Interoperability extern c {
 JNIEXPORT int JNICALL
 Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
 }
 
 JNIEXPORT int JNICALL
 Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObj) {
 return getpid();
 }
 
 public class ProcessIdentifier {
 static {
 System.loadLibrary("processidentifier");
 }
 
 public native void getProcessId();
 }
  71. 71. www.hazelcast.com@noctarius2k Problem 5: Native Interoperability extern c {
 JNIEXPORT int JNICALL
 Java_ProcessIdentifier_getProcessId(JNIEnv *, jobject);
 }
 
 JNIEXPORT int JNICALL
 Java_ProcessIdentifier_getProcessId(JNIEnv *env, jobject thisObj) {
 return getpid();
 }
 
 public class ProcessIdentifier {
 static {
 System.loadLibrary("processidentifier");
 }
 
 public native void getProcessId();
 } Fortunately we don’t deal with it, but who loves it anyways ;-)
  72. 72. www.hazelcast.com@noctarius2k Solution 5: Native Interoperability (for now) interface LibC {
 void getpid();
 }
 
 public int call() {
 LibC c = LibraryLoader.create(LibC.class).load("c");
 return c.getpid();
 } JNR, but guess what it uses internally ;-)
  73. 73. www.hazelcast.com@noctarius2k Solution 5: Native Interoperability public void call() { MethodType intType = MethodType.methodType(int.class); 
 MethodHandle handle = MethodHandles
 .findNative(null, “getpid”, intType); 
 return (int) handle.invokeExact();
 } They inline … just fine.
  74. 74. www.hazelcast.com@noctarius2k Problem 6: Immutable Types Defensive Copies, no real optimization yet
  75. 75. www.hazelcast.com@noctarius2k Solution 6: Immutable Types value class Point {
 final int x;
 final int y;
 }
 
 // Create a Point instance
 Point point = makeValue(1, 2); Value Types
  76. 76. www.hazelcast.com@noctarius2k Solution 6: Immutable Types int[] values = new int[2];
 int x = values[0];
 int y = values[1]; Looks like value class Point {
 final int x;
 final int y;
 }
 
 // Create a Point instance
 Point point = makeValue(1, 2); Value Types
  77. 77. www.hazelcast.com@noctarius2k Solution 6: Immutable Types value class Point {
 final int x;
 final int y;
 }
 
 // Create a Point instance
 Point point = makeValue(1, 2); Value Types int[] values = new int[2];
 int x = values[0];
 int y = values[1]; Stack var X var Y Looks like Stack Allocation!
  78. 78. www.hazelcast.com@noctarius2k Problem 7: Generics HazelcastInstance client = HazelcastClient.newHazelcastClient(); Map<Long, String> messages = client.getMap("messages"); String message = messages.get(1234L); No generics on primitives
  79. 79. www.hazelcast.com@noctarius2k Problem 7: Generics HazelcastInstance client = HazelcastClient.newHazelcastClient(); Map<Long, String> messages = client.getMap("messages"); String message = messages.get(1234L); No generics on primitives Auto-(Un)Boxing
  80. 80. www.hazelcast.com@noctarius2k Problem 7: Generics HazelcastInstance client = HazelcastClient.newHazelcastClient(); Map<Long, String> messages = client.getMap("messages"); String message = messages.get(1234L); No generics on primitives Auto-(Un)Boxing
  81. 81. www.hazelcast.com@noctarius2k Solution 7: Generics class Box<any T> {
 void set(T element) { ... }; 
 T get() { ... };
 } Specialized Generics (yeah it’s kind of a template)
  82. 82. www.hazelcast.com@noctarius2k Solution 7: Generics class Box<any T> {
 void set(T element) { ... }; 
 T get() { ... };
 } Specialized Generics (yeah it’s kind of a template) Box<int> Box${T=int}.class
 Box<String> Box${T=java.lang.String}.class
 Box<RandomClass> Box${T=RandomClass}.class
  83. 83. www.hazelcast.com@noctarius2k Solution 7: Generics public void generics() {
 List<int> intList = client.getList("foo");
 intList.add(1);
 int intValue = intList.get(0);
 
 Queue<String> stringQueue = client.getQueue("foo");
 stringQueue.offer("hello");
 String stringValue = stringQueue.poll();
 
 Map<int, String> messages = client.getMap("messages");
 messages.put(1234L, "hello");
 String message = messages.get(1234L);
 }
  84. 84. www.hazelcast.com@noctarius2k
  85. 85. www.hazelcast.com@noctarius2k Arrays 2.0 int[] values = new int[Long.MAX_VALUE];
  86. 86. www.hazelcast.com@noctarius2k Arrays 2.0 int[] values = new int[Long.MAX_VALUE]; Arrays.chop(T[] a, int newlength);
  87. 87. www.hazelcast.com@noctarius2k Arrays 2.0 int[] values = new int[Long.MAX_VALUE]; Arrays.chop(T[] a, int newlength); Box<String>[] ... = new Box<String>[];
  88. 88. www.hazelcast.com@noctarius2k Arrays 2.0 int[] values = new int[Long.MAX_VALUE]; Arrays.chop(T[] a, int newlength); Box<int>[] ... = new Box<int>[];
  89. 89. www.hazelcast.com@noctarius2k Arrays 2.0 int[] values = new int[Long.MAX_VALUE]; Arrays.chop(T[] a, int newlength); Box<int>[] ... = new Box<int>[]; char[] frozen = new char[20L].freeze();
  90. 90. www.hazelcast.com@noctarius2k Arrays 2.0 int[] values = new int[Long.MAX_VALUE]; Arrays.chop(T[] a, int newlength); Box<int>[] ... = new Box<int>[]; char[] frozen = new char[20L].freeze();
  91. 91. www.hazelcast.com@noctarius2k Cleaner API package java.nio; import sun.misc.Cleaner; class DirectByteBuffer
 extends MappedByteBuffer
 implements DirectBuffer { private static class Deallocator implements Runnable { private Deallocator(long address, long size, int capacity) {...} public void run() {...} } private final Cleaner cleaner; DirectByteBuffer(int cap) { ... cleaner = Cleaner.create(this, new Deallocator(base, size, cap)); } }
  92. 92. www.hazelcast.com@noctarius2k Cleaner API public selfCleaning() {
 try(AutoCleaning autoCleaning : new AutoCleaning()) {
 // do your thing here
 }
 }
  93. 93. www.hazelcast.com@noctarius2k Cleaner API public class AutoCleaning implements AutoCloseable { // A cleaner, preferably one shared within a library private static final Cleaner cleaner = ...; static class State implements Runnable { State(...) {/* initialize State needed for cleaning action */} public void run() {/*cleanup action accessing State, executed at most once*/} } private final State state; private final Cleaner.Cleanable cleanable; public AutoCleaning() { this.state = new State(...); this.cleanable = cleaner.register(this, state); } public void close() { cleanable.clean(); } }
  94. 94. www.hazelcast.com@noctarius2k Class Dynamic • Templating functionality
  95. 95. www.hazelcast.com@noctarius2k Class Dynamic • Templating functionality • Aspect-like approach
  96. 96. www.hazelcast.com@noctarius2k Class Dynamic • Templating functionality • Aspect-like approach • Group common functionality
  97. 97. www.hazelcast.com@noctarius2k Class Dynamic • Templating functionality • Aspect-like approach • Group common functionality • Enhanced Proxies R methodName(ARGS) {
 synchronized (this) {
 underlying.methodName(ARGS);
 }
 } Collections::sychronizedMap
  98. 98. www.hazelcast.com@noctarius2k Class Dynamic • Templating functionality • Aspect-like approach • Group common functionality • Enhanced Proxies Logging / Tracing R methodName(ARGS) {
 logger.trace("Before methodname X"); 
 underlying.methodName(ARGS);
 logger.trace("After methodname X");
 }
  99. 99. www.hazelcast.com@noctarius2k What Else? No idea! A lot is changing now. Java / JVM will be different. … but lots of interesting features, not only for us :)
  100. 100. www.hazelcast.com@noctarius2k What Else? Don’t forget about Jigsaw, test your application with Java 9 EA builds! https://jdk9.java.net/jigsaw/
  101. 101. www.hazelcast.com@noctarius2k “My mama always said, ‘Life was like a box of chocolates. You never know what you’re gonna get.”
  102. 102. www.hazelcast.com@noctarius2k “My mama always said, ‘Life was like a box of chocolates. You never know what you’re gonna get.” Forrest Gump
  103. 103. www.hazelcast.com@noctarius2k Thank You! Any Questions? @noctarius2k http://www.sourceprojects.org http://github.com/noctarius @hazelcast http://www.hazelcast.com http://www.hazelcast.org http://github.com/hazelcast
  104. 104. www.hazelcast.com@noctarius2k More information: • http://openjdk.java.net/jeps/193 • http://openjdk.java.net/jeps/254 • http://openjdk.java.net/jeps/285 • http://openjdk.java.net/projects/valhalla/ • http://cr.openjdk.java.net/~jrose/arrays/frozen-array-value-rules.html • https://twitter.com/PaulSandoz/status/623891528432394240 • http://openjdk.java.net/projects/panama/ • http://cr.openjdk.java.net/~jrose/values/values-0.html • http://cr.openjdk.java.net/~briangoetz/valhalla/spec-classdyn.html • http://blog.codefx.org/java/dev/the-road-to-valhalla/ Thank You!
  105. 105. www.hazelcast.com@noctarius2k Thank You! http://openjdk.java.net/jeps/259 http://openjdk.java.net/jeps/286 http://openjdk.java.net/jeps/276 http://openjdk.java.net/jeps/269 http://openjdk.java.net/jeps/266 http://openjdk.java.net/jeps/191 http://openjdk.java.net/jeps/186 http://openjdk.java.net/jeps/277

×