Unsafe: to be or to be removed?

59
Unsafe and Java 9/10 Алексей Федоров, Одноклассники / JUG.ru @23derevo

Transcript of Unsafe: to be or to be removed?

Page 1: Unsafe: to be or to be removed?

UnsafeandJava9/10АлексейФедоров,

Одноклассники/ JUG.ru@23derevo

Page 2: Unsafe: to be or to be removed?

2 @23derevo

Что такое Unsafe

• Оченьспециальныйобъект• СуществуетсJDK1.4 — уже15лет• НуженвClassLibrary,чтобыоттудадергать JVM

Page 3: Unsafe: to be or to be removed?

3 @23derevo

Что такое Unsafe

• Оченьспециальныйобъект• СуществуетсJDK1.4 — уже15лет• НуженвClassLibrary,чтобыоттудадергать JVM

“AVM/libraryinterface,designedstrictlyforusewithintheJDK”

MarkReinhold,JavaPlatformArchitectJVMLS2015

Page 4: Unsafe: to be or to be removed?

4 @23derevo

Используется в разных частях JDK

• 1.4— Reflection,Serialization,NIO• 1.5— JSR166(atomics,locks),CORBA,AWT• 6.0— JSR166(CopyOnWriteArrayList etc.)• 7 — JSR166(ForkJoin etc.),BigDecimal, j.l.invoke• 8— JSR166(много!),MacOSXobjectiveCbridge

Page 5: Unsafe: to be or to be removed?

5 @23derevo

sun.misc.Unsafe

• Лежитвприватномпакетеsun.misc- раньшевSunJDK- потомвOpenJDK- перекочевалвOracleJDK

Page 6: Unsafe: to be or to be removed?

6 @23derevo

А что на других JDK?

Page 7: Unsafe: to be or to be removed?

7 @23derevo

А что на других JDK?

Page 8: Unsafe: to be or to be removed?

public final class Unsafe {

static {…Reflection.registerMethodsToFilter(

Unsafe.class, "getUnsafe");…

}

private Unsafe() {}

private static final Unsafe theUnsafe = new Unsafe();

@CallerSensitivepublic static Unsafe getUnsafe() {

Class cc = Reflection.getCallerClass();if (cc.getClassLoader() != null)

throw new SecurityException("Unsafe");return theUnsafe;

}

Page 9: Unsafe: to be or to be removed?

Как получить Unsafepublic static final Unsafe UNSAFE = getUnsafe();

private static Unsafe getUnsafe() {try {

Field f = Unsafe.class.getDeclaredField("theUnsafe");

f.setAccessible(true);return (Unsafe) f.get(null);

} catch (Exception e) {throw new RuntimeException(e);

}}

Page 10: Unsafe: to be or to be removed?

10 @23derevo

И всё???

ПоумолчаниюSecutiry ManagerвJavaвыключен!

Page 11: Unsafe: to be or to be removed?

11 @23derevo

И всё???

$ java -Djava.security.manager

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.sun.misc")

ПоумолчаниюSecutiry ManagerвJavaвыключен!

Page 12: Unsafe: to be or to be removed?

«Тебя предупреждали»

$ javac Test.java

Test.java:2: warning: Unsafe is internal proprietary API and may be removed in a future releaseimport sun.misc.Unsafe;

^

Page 13: Unsafe: to be or to be removed?

«Да мне пофиг!»

$ javac Test.java

Test.java:2: warning: Unsafe is internal proprietary API and may be removed in a future releaseimport sun.misc.Unsafe;

^

$ javac -XDignore.symbol.file Test.java

Page 14: Unsafe: to be or to be removed?

ЧтоумеетUnsafe?

Page 15: Unsafe: to be or to be removed?
Page 16: Unsafe: to be or to be removed?

Demo1.AtomicInteger

Page 17: Unsafe: to be or to be removed?

package java.day.kiev;

public class MyUnsafe {public native int getInt(long address);

#include <jni.h>JNIEXPORT jint JNICALLJava_snow_misc_MyUnsafe(JNIEnv* env,

jobject myUnsafe, jlong address) {return *(jint*)address;

}

Page 18: Unsafe: to be or to be removed?

Create stack frameMove arguments according to ABI

Wrap objects into JNI handlesObtain JNIEnv* and jclass

Trace method_entryLock if synchronized

Lazy lookup and linkingin_java à in_native thread transition

Call the native functionCheck for safepoint

Switch state to in_javaUnlock if synchronized

Notify method_exitUnwrap result, reset JNI handles block

Handle exceptionsRemove stack frame

Сколько стоит JNI

Page 19: Unsafe: to be or to be removed?

Create stack frameMove arguments according to ABI

Wrap objects into JNI handlesObtain JNIEnv* and jclass

Trace method_entryLock if synchronized

Lazy lookup and linkingin_java à in_native thread transition

Call the native functionCheck for safepoint

Switch state to in_javaUnlock if synchronized

Notify method_exitUnwrap result, reset JNI handles block

Handle exceptionsRemove stack frame

Сколько стоит JNI

8+8

Page 20: Unsafe: to be or to be removed?

20 @23derevo

Intrinsics

• Большинствометодов— intrisics:- getInt —> mov- compareAndSwapInt —> cmpxchg

Page 21: Unsafe: to be or to be removed?

CASpublic final native boolean compareAndSwapInt(

Object o, long offset, int expected, int x);

public final int getAndAddInt(Object o, long offset, int delta) {

int v;do {

v = getIntVolatile(o, offset);} while (!compareAndSwapInt(

o, offset, v, v + delta));return v;

}

Page 22: Unsafe: to be or to be removed?

AtomicInteger — i.getAndAdd(5)

loop:mov 0xc(%r10),%eaxmov %eax,%r11dadd $0x5,%r11dlock cmpxchg %r11d,0xc(%r10)sete %r11bmovzbl %r11b,%r11dtest %r11d,%r11dje loop

JDK 7u72-XX:+PrintAssembly

Page 23: Unsafe: to be or to be removed?

AtomicInteger — i.getAndAdd(5)

loop:mov 0xc(%r10),%eaxmov %eax,%r11dadd $0x5,%r11dlock cmpxchg %r11d,0xc(%r10)sete %r11bmovzbl %r11b,%r11dtest %r11d,%r11dje loop

JDK 7u72 JDK 8u66

lock addl $0x5,0xc(%r10)

-XX:+PrintAssembly

Page 24: Unsafe: to be or to be removed?

AtomicInteger — i.getAndAdd(5)

loop:mov 0xc(%r10),%eaxmov %eax,%r11dadd $0x5,%r11dlock cmpxchg %r11d,0xc(%r10)sete %r11bmovzbl %r11b,%r11dtest %r11d,%r11dje loop

JDK 7u72 JDK 8u66

lock addl $0x5,0xc(%r10)

83

4615 11

132105

45 43

1 2 3 4

ops/μ

s

threads

-XX:+PrintAssembly

Page 25: Unsafe: to be or to be removed?

HowtofreememoryusingJavaUnsafe?

http://stackoverflow.com/questions/24429777

Page 26: Unsafe: to be or to be removed?

Demo2.freeMemory

Page 27: Unsafe: to be or to be removed?

27 @23derevo

hashCode (thanks to @AndreiPangin)

-XX:hashCode=n(http://habr.ru/post/165683/)• 0– Park-MillerRNG (поумолчанию)• 1– f(адрес,глобальное_состояние)• 2– константа1• 3– последовательныйсчетчик• 4– адресобъекта• 5– Thread-local Xorshift

Page 28: Unsafe: to be or to be removed?

Usecases

Page 29: Unsafe: to be or to be removed?

29 @23derevo

Off-heap Collections

• Lists,sets,maps- Largecapacity>2GB- PredictableGCpauses- Noheapfragmentation- Datalocality

Page 30: Unsafe: to be or to be removed?

Data locality

Key

ValueKey Value

Map.Entry Off-heaplayout

a b c a b c a b c

Page 31: Unsafe: to be or to be removed?

31 @23derevo

I/O and persistence

• Persistentcachesandstorages-Memory-mappedfiles(64-bit)- Sharedmemory

• CooperationwithOS- Pointerarithmetic,alignment- mlock,madvise etc.

Page 32: Unsafe: to be or to be removed?

32 @23derevo

IPC, Messaging

• Concurrentoff-heapbuffersandqueues• High-performancemessaging- Disruptor- Aeron:6Mmsg/s

• Shareddatastructures- ChronicleMap

Page 33: Unsafe: to be or to be removed?

УдалениеUnsafe

Page 34: Unsafe: to be or to be removed?

34 @23derevo

Тактика действий в случае удаления Unsafe

Page 35: Unsafe: to be or to be removed?

35 @23derevo

Тактика действий в случае удаления Unsafe

Page 36: Unsafe: to be or to be removed?

36 @23derevo

• Переписатькускикода- JNI- Reflection- NIO- etc.

Тактика действий в случае удаления Unsafe

Page 37: Unsafe: to be or to be removed?

37 @23derevo

• Переписатькускикода- JNI- Reflection- NIO- Etc.

• Какдействовать1. Новыйlayer:wrapper надUnsafe2. ЗаменитьнаwrapperнадpublicAPI

Тактика действий в случае удаления Unsafe

Page 38: Unsafe: to be or to be removed?

Беда1:PerformanceDegradation

Page 39: Unsafe: to be or to be removed?

Cassandra

Netty

Guava

Hazelcast

Mockito

GWT

HadoopZookeeper Kafka

Gson

Neo4j

Grails

Spring

Disruptor

JRuby

Scala

Akka

Page 40: Unsafe: to be or to be removed?

Unsafe

Cassandra

Netty

Guava

Hazelcast

Mockito

GWT

HadoopZookeeper Kafka

Gson

Neo4j

Grails

Spring

Disruptor

JRuby

Scala

Akka

Page 41: Unsafe: to be or to be removed?

Беда2:Транзитивныйlock-in

Page 42: Unsafe: to be or to be removed?

42 @23derevo

Как так получилось?

$ javac Test.java

Test.java:2: warning: Unsafe is internal proprietary API and may be removed in a future releaseimport sun.misc.Unsafe;

^

Page 43: Unsafe: to be or to be removed?

Слишкоммало евангелизма,Oracle!

Page 44: Unsafe: to be or to be removed?

Какразвиваласьситуация

Page 45: Unsafe: to be or to be removed?

45 @23derevo

Хронология событий

• JEP200:TheModularJDK- MarkReinholdвыступилна Devoxx 2014

• Постна blog.dripstat.com• ChrisEngelbert изHazelcast началдискуссию

Page 46: Unsafe: to be or to be removed?

46 @23derevo

Хронология событий

• JEP200:TheModularJDK- MarkReinholdвыступилна Devoxx 2014

• Постна blog.dripstat.com• ChrisEngelbert изHazelcast началдискуссию• ОбсуждениенаJCrete

Page 47: Unsafe: to be or to be removed?

47 @23derevo

Хронология событий

• JEP200:TheModularJDK- MarkReinholdвыступилна Devoxx 2014

• Постна blog.dripstat.com• ChrisEngelbert изHazelcast началдискуссию• ОбсуждениенаJCrete• MarkReinholdвыступилнаJVMLS• JEP260:EncapsulateMostInternalAPIs• JavaOne 2015— 5разъясняющихпрезентаций

Page 48: Unsafe: to be or to be removed?

48 @23derevo

План замены Unsafe на public API

• ReplacementinJDK8à hideinJDK9- sun.misc.BASE64Encoderetc.- Availableviacommand-lineflag

Page 49: Unsafe: to be or to be removed?

49 @23derevo

План замены Unsafe на public API

• ReplacementinJDK8à hideinJDK9- sun.misc.BASE64Encoderetc.- Availableviacommand-lineflag

• NoreplacementinJDK8à availableoutside- sun.misc.Unsafe,sun.reflect.ReflectionFactory- sun.misc.Cleaner,sun.misc.SignalHandler

Page 50: Unsafe: to be or to be removed?

50 @23derevo

План замены Unsafe на public API

• ReplacementinJDK8à hideinJDK9- sun.misc.BASE64Encoderetc.- Availableviacommand-lineflag

• NoreplacementinJDK8à availableoutside- sun.misc.Unsafe,sun.reflect.ReflectionFactory- sun.misc.Cleaner,sun.misc.SignalHandler

• ReplacementinJDK9à hideinJDK9,removeinJDK10

Page 51: Unsafe: to be or to be removed?

Чтоприходитназамену

Page 52: Unsafe: to be or to be removed?

JEP 193: VarHandles (Expected in Java 9)

class Queue {int size;...

}

VarHandle queueSize= VarHandles.lookup().findFieldHandle(

Queue.class, "size", int.class);

queueSize.addAndGet(10);

Page 53: Unsafe: to be or to be removed?

53

• get, getVolatile, getAcquire, getOpaque• set, setVolatile, setRelease, setOpaque• compareAndSet, compareAndExchangeVolatile• compareAndExchangeAcquire, compareAndExchangeRelease• weakCompareAndSet, weakCompareAndSetAcquire, weakCompareAndSetRelease

• getAndSet, getAndAdd, addAndGet

VarHandle handle = VarHandles.arrayElement(int[].class)

VarHandle viewH = VarHandles.arrayElementViewHandle(byte[].class, long[].class, true);

Page 54: Unsafe: to be or to be removed?

54 @23derevo

Итоги

• Oracleуслышалсообществоиизменилпланы- Oracleготовидальшеслушать- Сообществопредставляетсобойсилу,занимэкосистема

• Unsafeвсе-такивыпилят- Нопостепенно,втечениенесколькихлет

Page 55: Unsafe: to be or to be removed?

55 @23derevo

Полезные материалы

• MarkReinhold@JVMLS2015- https://youtu.be/4HG0YQVy8UM

• PaulSandoz@JavaOne 2015- http://cr.openjdk.java.net/~psandoz/conferences/2015-JavaOne/j1-2015-unsafe-CON7076.pdf

• AndreiPangin @Joker2015- http://www.slideshare.net/AndreiPangin/do-we-need-unsafe-in-java

Page 56: Unsafe: to be or to be removed?

56 @23derevo

Development @ Одноклассники

• TechBlog- http://habrahabr.ru/company/odnoklassniki

• Opensource- https://github.com/odnoklassniki

• Career- http://v.ok.ru

Page 57: Unsafe: to be or to be removed?

БлагодарюАндреяПаньгина

@AndreiPangin

Page 58: Unsafe: to be or to be removed?

Вопросыиответы

Page 59: Unsafe: to be or to be removed?

Спасибозавнимание!

@[email protected]