(Equipment to be removed, site layout, elevation, drainage drawings ...
Unsafe: to be or to be removed?
-
Upload
alexey-fyodorov -
Category
Engineering
-
view
1.272 -
download
2
Transcript of Unsafe: to be or to be removed?
![Page 1: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/1.jpg)
UnsafeandJava9/10АлексейФедоров,
Одноклассники/ JUG.ru@23derevo
![Page 2: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/2.jpg)
2 @23derevo
Что такое Unsafe
• Оченьспециальныйобъект• СуществуетсJDK1.4 — уже15лет• НуженвClassLibrary,чтобыоттудадергать JVM
![Page 3: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/3.jpg)
3 @23derevo
Что такое Unsafe
• Оченьспециальныйобъект• СуществуетсJDK1.4 — уже15лет• НуженвClassLibrary,чтобыоттудадергать JVM
“AVM/libraryinterface,designedstrictlyforusewithintheJDK”
MarkReinhold,JavaPlatformArchitectJVMLS2015
![Page 4: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/4.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/5.jpg)
5 @23derevo
sun.misc.Unsafe
• Лежитвприватномпакетеsun.misc- раньшевSunJDK- потомвOpenJDK- перекочевалвOracleJDK
![Page 6: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/6.jpg)
6 @23derevo
А что на других JDK?
![Page 7: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/7.jpg)
7 @23derevo
А что на других JDK?
![Page 8: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/8.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/9.jpg)
Как получить 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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/10.jpg)
10 @23derevo
И всё???
ПоумолчаниюSecutiry ManagerвJavaвыключен!
![Page 11: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/11.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/12.jpg)
«Тебя предупреждали»
$ 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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/13.jpg)
«Да мне пофиг!»
$ 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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/14.jpg)
ЧтоумеетUnsafe?
![Page 15: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/15.jpg)
![Page 16: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/16.jpg)
Demo1.AtomicInteger
![Page 17: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/17.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/18.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/19.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/20.jpg)
20 @23derevo
Intrinsics
• Большинствометодов— intrisics:- getInt —> mov- compareAndSwapInt —> cmpxchg
![Page 21: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/21.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/22.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/23.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/24.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/25.jpg)
HowtofreememoryusingJavaUnsafe?
http://stackoverflow.com/questions/24429777
![Page 26: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/26.jpg)
Demo2.freeMemory
![Page 27: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/27.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/28.jpg)
Usecases
![Page 29: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/29.jpg)
29 @23derevo
Off-heap Collections
• Lists,sets,maps- Largecapacity>2GB- PredictableGCpauses- Noheapfragmentation- Datalocality
![Page 30: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/30.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/31.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/32.jpg)
32 @23derevo
IPC, Messaging
• Concurrentoff-heapbuffersandqueues• High-performancemessaging- Disruptor- Aeron:6Mmsg/s
• Shareddatastructures- ChronicleMap
![Page 33: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/33.jpg)
УдалениеUnsafe
![Page 34: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/34.jpg)
34 @23derevo
Тактика действий в случае удаления Unsafe
![Page 35: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/35.jpg)
35 @23derevo
Тактика действий в случае удаления Unsafe
![Page 36: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/36.jpg)
36 @23derevo
• Переписатькускикода- JNI- Reflection- NIO- etc.
Тактика действий в случае удаления Unsafe
![Page 37: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/37.jpg)
37 @23derevo
• Переписатькускикода- JNI- Reflection- NIO- Etc.
• Какдействовать1. Новыйlayer:wrapper надUnsafe2. ЗаменитьнаwrapperнадpublicAPI
Тактика действий в случае удаления Unsafe
![Page 38: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/38.jpg)
Беда1:PerformanceDegradation
![Page 39: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/39.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/40.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/41.jpg)
Беда2:Транзитивныйlock-in
![Page 42: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/42.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/43.jpg)
Слишкоммало евангелизма,Oracle!
![Page 44: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/44.jpg)
Какразвиваласьситуация
![Page 45: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/45.jpg)
45 @23derevo
Хронология событий
• JEP200:TheModularJDK- MarkReinholdвыступилна Devoxx 2014
• Постна blog.dripstat.com• ChrisEngelbert изHazelcast началдискуссию
![Page 46: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/46.jpg)
46 @23derevo
Хронология событий
• JEP200:TheModularJDK- MarkReinholdвыступилна Devoxx 2014
• Постна blog.dripstat.com• ChrisEngelbert изHazelcast началдискуссию• ОбсуждениенаJCrete
![Page 47: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/47.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/48.jpg)
48 @23derevo
План замены Unsafe на public API
• ReplacementinJDK8à hideinJDK9- sun.misc.BASE64Encoderetc.- Availableviacommand-lineflag
![Page 49: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/49.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/50.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/51.jpg)
Чтоприходитназамену
![Page 52: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/52.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/53.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/54.jpg)
54 @23derevo
Итоги
• Oracleуслышалсообществоиизменилпланы- Oracleготовидальшеслушать- Сообществопредставляетсобойсилу,занимэкосистема
• Unsafeвсе-такивыпилят- Нопостепенно,втечениенесколькихлет
![Page 55: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/55.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/56.jpg)
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?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/57.jpg)
БлагодарюАндреяПаньгина
@AndreiPangin
![Page 58: Unsafe: to be or to be removed?](https://reader034.fdocuments.in/reader034/viewer/2022052318/587ac39e1a28abc0478b75b5/html5/thumbnails/58.jpg)
Вопросыиответы