+ All Categories
Home > Documents > Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4...

Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4...

Date post: 03-Aug-2020
Category:
Upload: others
View: 7 times
Download: 0 times
Share this document with a friend
53
Unsafe: халява закончилась? Алексей Федоров, Одноклассники / JUG.ru
Transcript
Page 1: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

Unsafe:халявазакончилась?

АлексейФедоров,Одноклассники/ JUG.ru

Page 2: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

2

Что такое Unsafe

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

“AVM/libraryinterface,designedstrictlyforusewithintheJDK”

MarkReinhold,JavaPlatformArchitectJVMLS2015

Page 3: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

3

Что такое Unsafe

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

Page 4: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

4

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

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

Page 5: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

5

sun.misc.Unsafe

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

Page 6: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

6

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

Page 7: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

7

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

Page 8: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

public final class Unsafe {

static {registerNatives();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: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

9

Как получить Unsafe

public 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: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

10

И всё???

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

Page 11: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

11

И всё???

$ java -Djava.security.manager

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

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

Page 12: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

12

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

$ 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: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

13

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

$ 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: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

ЧтоумеетUnsafe?

Page 15: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,
Page 16: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

package cee.secr.misc;

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 17: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

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 18: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

18

Intrinsics

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

Page 19: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

CAS// nativepublic final native boolean compareAndSwapInt(

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

//non-nativepublic 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 20: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

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 21: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

Usecases

Page 22: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

22

Off-heap Collections

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

Page 23: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

23Data locality

Key

ValueKey

Value

Map.Entry Off-heaplayout

a b c a b c a b c

Page 24: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

24

I/O and persistence

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

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

Page 25: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

25

IPC, Messaging

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

• Shareddatastructures- ChronicleMap

Page 26: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

УдалениеUnsafe

Page 27: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

27

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

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

Page 28: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

28

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

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

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

Page 29: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

Беда1:PerformanceDegradation

Page 30: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

Cassandra

Netty

Guava

Hazlecast

Mockito

GWT

HadoopZookeeper

Kafka

Gson

Neo4j

Grails

Spring

Disruptor

JRuby

Scala

Akka

Page 31: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

Cassandra

Netty

Guava

Hazlecast

Mockito

GWT

HadoopZookeeper

Kafka

Gson

Neo4j

Grails

Spring

JRuby

Scala

Akka

UnsafeDisruptor

Page 32: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

Беда2:Transitivelock-in

Page 33: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

33

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

$ javac Test.java

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

^

Page 34: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

34

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

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

$ javac Test.java

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

^

Page 35: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

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

Page 36: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

36

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

• JEP200:TheModularJDK

Page 37: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

37

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

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

Page 38: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

38

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

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

• Постна blog.dripstat.com

Page 39: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

39

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

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

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

Page 40: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

40

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

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

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

Page 41: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

41

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

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

• Постна blog.dripstat.com• ChrisEngelbert изHazelcast началдискуссию• ОбсуждениенаJCrete• MarkReinholdвыступилнаJVMLS- всенемногоуспокоились

Page 42: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

42

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

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

• Постна blog.dripstat.com• ChrisEngelbert изHazelcast началдискуссию• ОбсуждениенаJCrete• MarkReinholdвыступилнаJVMLS- всенемногоуспокоились

• JEP260:EncapsulateMostInternalAPIs

Page 43: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

43

План замены 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 44: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

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

Page 45: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

JEP193:VarHandlesExpectedinJava9

class Queue {int size;...

}

VarHandle queueSize = VarHandles.lookup().findFieldHandle(Queue.class, "size", int.class);

queueSize.addAndGet(10);

Page 46: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

46

• 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 viewHandle = VarHandles.arrayElementViewHandle(byte[].class, long[].class, true);

Page 47: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

47

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(8);VarHandle bufferView =

VarHandles.byteBufferViewHandle(long[].class, true);

MemoryRegion region = MemoryRegion.allocateNative("myname", MemoryRegion.UNALIGNED, Long.MAX_VALUE);

VarHandle regionView =VarHandles.memoryRegionViewHandle(long[].class, true);

regionView.set(region, 0, Long.MAX_VALUE);return regionView.get(region, 0);

Page 48: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

48

Итоги

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

Page 49: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

49

Итоги

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

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

Page 50: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

50

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

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

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

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

Page 51: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

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

@AndreyPangin

Page 52: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

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

Page 53: Unsafe: халява закончилась?2015.secrus.org/2015/files/027_fyodorov.pdf · 4 Используется в разных частях JDK • 1.4 —Reflection, Serialization,

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

@[email protected]


Recommended