A Post-Apocalyptic sun.misc.Unsafe World

50 %
50 %
Information about A Post-Apocalyptic sun.misc.Unsafe World

Published on March 7, 2016

Author: ChristophEngelbert

Source: slideshare.net

1. http://www.superbwallpapers.com/fantasy/post-apocalyptic-tower-bridge-london-26546/ A Post-Apocalyptic sun.misc.Unsafe World

2. Jatumba!
 
 2014, 2015, 2016, … Chris Engelbert Twitter: @noctarius2k

3. Disclaimer This talk is not going to be negative!

4. Disclaimer But certain things are highly speculative
 and APIs or ideas might change by tomorrow!

5. http://www.underwhelmedcomic.com/wp-content/uploads/2012/03/runningdude.jpg sun.misc.Scissors

6. sun.misc.Unsafe - What you (don’t) know

7. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package)

8. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package)

9. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package) • Used inside the JVM / JRE

10. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package) • Used inside the JVM / 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

11. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package) • Used inside the JVM / JRE • Used outside as well

12. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package) • Used inside the JVM / JRE • Used outside as well (good // Deserialization public Object readObject(InputStream is) {
 SomeType element = unsafe.allocateInstance(SomeType.class);
 element.deserializeValues(is);
 return element;
 }

13. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package) • Used inside the JVM / JRE • Used outside as well (good, bad)

14. # # 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 #

15. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package) • Used inside the JVM / JRE • Used outside as well (good / bad) • Never intended for outside use

16. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package) • Used inside the JVM / JRE • Used outside as well (good / bad) • Never intended for outside use

17. sun.misc.Unsafe - What you (don’t) know • Internal class (sun.misc Package) • Used inside the JVM / JRE • Used outside as well (good / bad) • Never intended for outside use • Used by popular: • Applications • Frameworks • Libraries

18. MapDB Netty Hazelcast Cassandra Mockito EasyMock JMock Scala Spock Robolectric Grails Gson Neo4j Apache Ignite Apache Spark Apache Kafka Apache Wink Apache Storm Apache Flink Apache Continuum Zookeeper Dropwizard Metrics (AOP) Kryo Byte Buddy Hibernate Liquibase Spring Framework Ehcache OrientDB Chronicle Apache Hadoop Apache HBase GWT Disruptor JRuby AkkaAgrona Aeron Simple Binary Encoding XRebel Presto jol ActivePivot LWJGL XAP XStream CapLogic WildFly Infinispan

19. MapDB Netty Hazelcast Cassandra Mockito EasyMock JMock Scala Spock Robolectric Grails Gson Neo4j Apache Ignite Apache Spark Apache Kafka Apache Wink Apache Storm Apache Flink Apache Continuum Zookeeper Dropwizard Metrics (AOP) Kryo Byte Buddy Hibernate Liquibase Spring Framework Ehcache OrientDB Chronicle Apache Hadoop Apache HBase GWT Disruptor JRuby AkkaAgrona Aeron Simple Binary Encoding XRebel Presto jol ActivePivot LWJGL XAP XStream CapLogic WildFly Infinispan

20. sun.misc.Unsafe is only supported on HotSpot JVMs anyways, isn’t it?

21. sun.misc.Unsafe is only supported on HotSpot JVMs anyways, isn’t it? No!

22. 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

23. Use Cases - The Good Ones!

24. Use Cases - The Good Ones! • Low Latency, GC Overhead

25. Use Cases - The Good Ones! • Low Latency, GC Overhead Caution: Overly simplified! Unsafe unsafe = findUnsafe();
 long baseAddress = unsafe.allocateMemory(8); 
 class Point {
 long offsetX = 0;
 long offsetY = 4;
 
 int getX(long baseAddress) { return unsafe.getInt(baseAddress + offsetX); } 
 int getY(long baseAddress) { return unsafe.getInt(baseAddress + offsetY); }
 }

26. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization

27. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization // Deserialization public Object readObject(InputStream is) {
 SomeType element = unsafe.allocateInstance(SomeType.class);
 element.deserializeValues(is);
 return element;
 }

28. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions

29. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions long baseAddress = unsafe.allocateMemory(Long.MAX_VALUE);
 unsafe.putInt(baseAddress + Long.MAX_VALUE - 4, Integer.MAX_VALUE);

30. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations

31. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations unsafe.compareAndSwapInt(this, offsetField, oldValue, newValue);
 unsafe.compareAndSwapLong(this, offsetField, oldValue, newValue);
 unsafe.compareAndSwapObject(this, offsetField, oldObject, newObject);

32. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout

33. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout class Point {
 long offsetX = 0;
 long offsetY = 4;
 } offsetX offsetY

34. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout • Fast field / memory access

35. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout • Fast field / memory access long versionFieldOffset = unsafe.objectFieldOffset(versionField);
 
 long version = unsafe.getLong(this, versionFieldOffset);
 
 unsafe.putLong(this, versionFieldOffset, 10L);

36. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout • Fast field / memory access • Access to array with volatile semantics

37. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout • Fast field / memory access • Access to array with volatile semantics long base = unsafe.arrayBaseOffset(int[].class);
 long index = unsafe.arrayIndexScale(int[].class);
 
 unsafe.getIntVolatile(array, base + (index * 3));

38. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout • Fast field / memory access • Access to array with volatile semantics • Custom memory fences

39. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout • Fast field / memory access • Access to array with volatile semantics • Custom memory fences unsafe.fullFence(); 
 unsafe.storeFence(); 
 unsafe.loadFence();

40. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout • Fast field / memory access • Access to array with volatile semantics • Custom memory fences • Fast interaction with native code

41. Use Cases - The Good Ones! • Low Latency, GC Overhead • Fast (de-)serialization • 64bit Memory regions • Atomic memory operations • Efficient memory layout • Fast field / memory access • Access to array with volatile semantics • Custom memory fences • Fast interaction with native code long addr = unsafe.allocateMemory(50);
 copyBytes(addr, byteArray);
 nativeCall(addr);

42. Get Access

43. Get Access Easy One (not working outside the JRE / JDK) Unsafe unsafe = Unsafe.getUnsafe();

44. Get Access The Ugly One 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);
 }
 }

45. Get Access The Working One (at least for more than just HotSpot) private 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");
 }
 });
 }
 }

46. 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);
 }
 }

47. Get Access Does Any Of This Feel Right?

48. Weird! No!

49. WAAAAAT!?!? No!

50. 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 http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-April/017028.html

51. 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 http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-April/017028.html

52. 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 http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-April/017028.html

53. 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 http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-April/017028.html

54. Oracle created a new Taskforce

55. Oracle created a new Taskforce K.U.T.T. - Kill Unsafe To Total death

56. 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 http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-April/017028.html

57. So What’s Coming?

58. 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; } } } Atomic Updates

59. Atomic Updates private final AtomicLong version = new AtomicLong(0); public long increment() { return version.incrementAndGet(); }

60. Atomic Updates 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);
 }

61. 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);
 }

62. Atomic Updates public static VarHandle findVersionVarHandle() {
 try {
 return MethodHandles.lookup().
 findFieldVarHandle(Record.class, "version", long.class);
 
 } catch (Exception e) {
 throw new Error(e);
 }
 }

63. Memory Management public long memory() {
 long address = UNSAFE.allocateMemory(8); 
 UNSAFE.putLong(address, Long.MAX_VALUE); 
 return UNSAFE.getLong(address);
 }

64. Memory Management public long memory() {
 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(8);
 
 byteBuffer.putLong(0, Long.MAX_VALUE);
 
 return byteBuffer.getLong(0);
 }

65. 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);
 }

66. Memory Management public long memory() {
 MemoryRegion region = MemoryRegion.allocateNative
 ("myname", MemoryRegion.UNALIGNED, Long.MAX_VALUE);
 
 VarHandle regionView = MethodHandles.
 memoryRegionViewVarHandle(long[].class, true); 
 regionView.set(region, 0, Long.MAX_VALUE); 
 return regionView.get(region, 0);
 }

67. Deserialization private static final Unsafe UNSAFE = findUnsafe();
 
 private static final long VALUE_OFFSET = findValueOffset();
 
 public String deserializeString() throws Exception {
 char[] chars = readCharsFromStream();
 String allocated = (String) UNSAFE.allocateInstance(String.class);
 UNSAFE.putObjectVolatile(allocated, VALUE_OFFSET, chars);
 return allocated;
 }

68. Deserialization public String deserializeString() throws Exception {
 char[] chars = readCharsFromStream().freeze();
 
 ReflectionFactory reflectionFactory =
 ReflectionFactory.getReflectionFactory();
 
 Constructor<String> constructor = reflectionFactory
 .newConstructorForSerialization(String.class, char[].class);
 
 return constructor.newInstance(chars);
 }

69. 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 talk();
 }

70. Interoperability interface LibC {
 void getpid();
 }
 
 public int call() {
 LibC c = LibraryLoader.create(LibC.class).load("c");
 return c.getpid();
 }

71. Interoperability public void call() { MethodType intType = MethodType.methodType(int.class); 
 MethodHandle handle = MethodHandles
 .findNative(null, “getpid”, intType); 
 return (int) handle.invokeExact();
 }

72. Value Types value class Point {
 final int x;
 final int y;
 }
 
 // Create a Point instance
 Point point = makeValue(1, 2);

73. Value Types int[] values = new int[2];
 int x = values[0];
 int y = values[1];

74. Value Types int[] values = new int[2];
 int x = values[0];
 int y = values[1]; Stack var X var Y

75. Value Types int[] values = new int[2];
 int x = values[0];
 int y = values[1]; Stack var X var Y Stack Allocation!

76. Specialized Generics class Box<any T> {
 void set(T element) { ... }; 
 T get() { ... };
 }

77. Specialized Generics class Box<any T> {
 void set(T element) { ... }; 
 T get() { ... };
 } Box<int> Box${T=int}.class
 Box<String> Box${T=java.lang.String}.class
 Box<RandomClass> Box${T=RandomClass}.class

78. Specialized Generics public void generics() {
 Box<int> intBox = new Box<>();
 intBox.set(1);
 int intValue = intBox.get();
 
 Box<String> stringBox = new Box<>();
 stringBox.set("hello");
 String stringValue = stringBox.get();
 
 Box<RandomClass> box = new Box<>();
 box.set(new RandomClass());
 RandomClass value = box.get();
 }

79. Arrays 2.0 int[] values = new int[Long.MAX_VALUE];

80. Arrays 2.0 int[] values = new int[Long.MAX_VALUE]; Arrays.chop(T[] a, int newlength);

81. Arrays 2.0 int[] values = new int[Long.MAX_VALUE]; Arrays.chop(T[] a, int newlength); Box<String>[] ... = new Box<String>[];

82. Arrays 2.0 int[] values = new int[Long.MAX_VALUE]; Arrays.chop(T[] a, int newlength); Box<String>[] ... = new Box<String>[]; char[] frozen = new char[20L].freeze();

83. Arrays 2.0 int[] values = new int[Long.MAX_VALUE]; Arrays.chop(T[] a, int newlength); Box<String>[] ... = new Box<String>[]; char[] frozen = new char[20L].freeze(); Point[] points = new Point[3]; Stack var X var Y var X var Y var X var Y points[0] points[1] points[2]

84. Class Dynamic

85. Class Dynamic •Templating functionality

86. Class Dynamic •Templating functionality •Aspect-like approach

87. Class Dynamic •Templating functionality •Aspect-like approach •Group common functionality

88. Class Dynamic •Templating functionality •Aspect-like approach •Group common functionality •Enhanced Proxies

89. Class Dynamic •Templating functionality •Aspect-like approach •Group common functionality •Enhanced Proxies R methodName(ARGS) {
 synchronized (this) {
 underlying.methodName(ARGS);
 }
 } Collections::sychronizedMap

90. 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");
 }

91. Class Dynamic •Templating functionality •Aspect-like approach •Group common functionality •Enhanced Proxies Your Use Case!

92. SpinWait Hints

93. SpinWait Hints Hints the JVM that a busy spin’s upcoming

94. SpinWait Hints Hints the JVM that a busy spin’s upcoming JVM CAN intrinsify to use a WAIT opcode for the specific platform / CPU

95. SpinWait Hints Hints the JVM that a busy spin’s upcoming JVM CAN intrinsify to use a WAIT opcode for the specific platform / CPU No-Op implementation for non supported CPUs

96. SpinWait Hints Hints the JVM that a busy spin’s upcoming JVM CAN intrinsify to use a WAIT opcode for the specific platform / CPU No-Op implementation for non supported CPUs while (!shutdown) {
 while (queue.length == 0) {
 // Hint the JVM to intrinsify wait
 // opcode otherwise busy spin 
 Thread.onSpinWait();
 }
 consume(queue);
 }

97. What Else? No idea! A lot is changing now. Java / JVM will be different.

98. What Else? No idea! A lot is changing now. Java / JVM will be different. Don’t forget about Jigsaw, test your application with Java 9 EA builds! https://jdk9.java.net/jigsaw/

99. Questions? github.com/noctarius @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/

Add a comment

Related pages

A Post-Apocalyptic sun.misc.Unsafe World - InfoQ: Software ...

The removal of sun.misc.Unsafe and other private APIs in Java 9 has in recent weeks divided the Java community perhaps as never before in its 20 ...
Read more

sun.misc.Unsafe的后启示录

Java 9将要移除sun.misc.Unsafe和其他私有的API,在Java社区中引起了分歧,这在Java 20年的历史中是没有发生过的。尽管已经 ...
Read more

The Post-Apocalyptic sun.misc.Unsafe World

The announcement that sun.misc.Unsafe will disappear in Java 9 created a huge buzz in the community and lots of people didn’t agree with the idea.
Read more

Article: A Post-Apocalyptic sun.misc.Unsafe World - 推酷

Java as a language and the JVM as a platform just celebrated its 20th birthday. With its noble origins on set-top-boxes, mobiles and java-cards, as well as ...
Read more

DukeCon

Favoriten werden erst mit Eurem Konto synchronisiert wenn Ihr Euch einloggt bzw. registriert. Clickt dazu auf das Schloss-Symbol oben.
Read more

Rüdiger Möller - Google+

Rüdiger Möller. Worked at Deutsche Börse. 145 followers | 2,121,586 views. ... http://www.infoq.com/articles/A-Post-Apocalyptic-sun.misc.Unsafe-World ...
Read more

Java Weekly 37/15: Optional, Unsafe, G1 benchmark, MVC 1.0

Java Weekly 37/15: Optional, Unsafe, G1 benchmark, MVC 1.0. by Thorben Janssen 1 Comment. ... A Post-Apocalyptic sun.misc.Unsafe World Christoph Engelbert.
Read more

Mani Sarkar - Google+

Mani Sarkar - Java developer - London - Java developer! Adopt OpenJDK programs, Agile ... A Post-Apocalyptic sun.misc.Unsafe World ...
Read more

Upcoming Events - Hazelcast the Leading In-Memory Data ...

Upcoming Events. Sydney Hands-On Training Class. March 3, ... Chris will present A Post-Apocalyptic sun.misc.Unsafe World. From the JavaLand website: ...
Read more