SlideShare a Scribd company logo
1 of 59
Download to read offline
Unsafe	and	Java	9/10
Алексей	Федоров,	
Одноклассники	/ JUG.ru
@23derevo
2 @23derevo
Что такое Unsafe
• Очень	специальный	объект
• Существует	с	JDK	1.4 — уже	15	лет
• Нужен	в	Class	Library,	чтобы	оттуда	дергать JVM
3 @23derevo
Что такое Unsafe
• Очень	специальный	объект
• Существует	с	JDK	1.4 — уже	15	лет
• Нужен	в	Class	Library,	чтобы	оттуда	дергать JVM
“A	VM/library	interface,	designed	
strictly	for	use	within	the	JDK”
Mark	Reinhold,	Java	Platform	Architect
JVMLS	2015
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	(много!),	Mac	OS	X	objective	C	bridge
5 @23derevo
sun.misc.Unsafe
• Лежит	в	приватном	пакете	sun.misc
- раньше	в	Sun	JDK
- потом	в	OpenJDK
- перекочевал	в	Oracle	JDK
6 @23derevo
А что на других JDK?
7 @23derevo
А что на других JDK?
public final class Unsafe {
static {
…
Reflection.registerMethodsToFilter(
Unsafe.class, "getUnsafe");
…
}
private Unsafe() {}
private static final Unsafe theUnsafe = new Unsafe();
@CallerSensitive
public static Unsafe getUnsafe() {
Class cc = Reflection.getCallerClass();
if (cc.getClassLoader() != null)
throw new SecurityException("Unsafe");
return theUnsafe;
}
Как получить 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);
}
}
10 @23derevo
И всё???
По	умолчанию	Secutiry Manager	в	Java	выключен!
11 @23derevo
И всё???
$ java -Djava.security.manager
java.security.AccessControlException:
access denied ("java.lang.RuntimePermission"
"accessClassInPackage.sun.misc")
По	умолчанию	Secutiry Manager	в	Java	выключен!
«Тебя предупреждали»
$ javac Test.java
Test.java:2: warning: Unsafe is internal
proprietary API and may be removed in a
future release
import sun.misc.Unsafe;
^
«Да мне пофиг!»
$ javac Test.java
Test.java:2: warning: Unsafe is internal
proprietary API and may be removed in a
future release
import sun.misc.Unsafe;
^
$ javac -XDignore.symbol.file Test.java
Что	умеет	Unsafe?
Demo	1.	AtomicInteger
package java.day.kiev;
public class MyUnsafe {
public native int getInt(long address);
#include <jni.h>
JNIEXPORT jint JNICALL
Java_snow_misc_MyUnsafe(JNIEnv* env,
jobject myUnsafe, jlong address) {
return *(jint*)address;
}
Create stack frame
Move arguments according to ABI
Wrap objects into JNI handles
Obtain JNIEnv* and jclass
Trace method_entry
Lock if synchronized
Lazy lookup and linking
in_java à in_native thread transition
Call the native function
Check for safepoint
Switch state to in_java
Unlock if synchronized
Notify method_exit
Unwrap result, reset JNI handles block
Handle exceptions
Remove stack frame
Сколько стоит JNI
Create stack frame
Move arguments according to ABI
Wrap objects into JNI handles
Obtain JNIEnv* and jclass
Trace method_entry
Lock if synchronized
Lazy lookup and linking
in_java à in_native thread transition
Call the native function
Check for safepoint
Switch state to in_java
Unlock if synchronized
Notify method_exit
Unwrap result, reset JNI handles block
Handle exceptions
Remove stack frame
Сколько стоит JNI
8	+	8
20 @23derevo
Intrinsics
• Большинство	методов	— intrisics:
- getInt —> mov
- compareAndSwapInt —> cmpxchg
CAS
public 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;
}
AtomicInteger — i.getAndAdd(5)
loop:
mov 0xc(%r10),%eax
mov %eax,%r11d
add $0x5,%r11d
lock cmpxchg %r11d,0xc(%r10)
sete %r11b
movzbl %r11b,%r11d
test %r11d,%r11d
je loop
JDK 7u72
-XX:+PrintAssembly
AtomicInteger — i.getAndAdd(5)
loop:
mov 0xc(%r10),%eax
mov %eax,%r11d
add $0x5,%r11d
lock cmpxchg %r11d,0xc(%r10)
sete %r11b
movzbl %r11b,%r11d
test %r11d,%r11d
je loop
JDK 7u72 JDK 8u66
lock addl $0x5,0xc(%r10)
-XX:+PrintAssembly
AtomicInteger — i.getAndAdd(5)
loop:
mov 0xc(%r10),%eax
mov %eax,%r11d
add $0x5,%r11d
lock cmpxchg %r11d,0xc(%r10)
sete %r11b
movzbl %r11b,%r11d
test %r11d,%r11d
je loop
JDK 7u72 JDK 8u66
lock addl $0x5,0xc(%r10)
83
46
15 11
132
105
45 43
1 2 3 4
ops	/	μs
threads
-XX:+PrintAssembly
How	to	free	memory	using	Java	Unsafe?
http://stackoverflow.com/questions/24429777
Demo	2.	freeMemory
27 @23derevo
hashCode (thanks to @AndreiPangin)
-XX:hashCode=n					(http://habr.ru/post/165683/)
• 0	– Park-Miller	RNG (по	умолчанию)
• 1	– f(адрес,	глобальное_состояние)
• 2	– константа	1
• 3	– последовательный	счетчик
• 4	– адрес	объекта
• 5	– Thread-local Xorshift
Use	cases
29 @23derevo
Off-heap Collections
• Lists,	sets,	maps
- Large	capacity	>	2	GB
- Predictable	GC	pauses
- No	heap	fragmentation	
- Data	locality
Data locality
Key
ValueKey
Value
Map.Entry Off-heap	layout
a b c a b c a b c
31 @23derevo
I/O and persistence
• Persistent	caches	and	storages
- Memory-mapped	files	(64-bit)
- Shared	memory
• Cooperation	with	OS
- Pointer	arithmetic,	alignment
- mlock,	madvise etc.
32 @23derevo
IPC, Messaging
• Concurrent	off-heap	buffers	and	queues
• High-performance	messaging
- Disruptor
- Aeron:	6M	msg/s
• Shared	data	structures
- Chronicle	Map
Удаление	Unsafe
34 @23derevo
Тактика действий в случае удаления Unsafe
35 @23derevo
Тактика действий в случае удаления Unsafe
36 @23derevo
• Переписать	куски	кода
- JNI
- Reflection
- NIO
- etc.
Тактика действий в случае удаления Unsafe
37 @23derevo
• Переписать	куски	кода
- JNI
- Reflection
- NIO
- Etc.
• Как	действовать
1. Новый	layer:	wrapper над	Unsafe
2. Заменить	на	wrapper	над	public	API
Тактика действий в случае удаления Unsafe
Беда	1:	Performance	Degradation
Cassandra
Netty
Guava
Hazelcast
Mockito
GWT
Hadoop
Zookeeper
Kafka
Gson
Neo4j
Grails
Spring
Disruptor
JRuby
Scala
Akka
Unsafe
Cassandra
Netty
Guava
Hazelcast
Mockito
GWT
Hadoop
Zookeeper
Kafka
Gson
Neo4j
Grails
Spring
Disruptor
JRuby
Scala
Akka
Беда	2:	Транзитивный	lock-in
42 @23derevo
Как так получилось?
$ javac Test.java
Test.java:2: warning: Unsafe is internal
proprietary API and may be removed in a future
release
import sun.misc.Unsafe;
^
Слишком	мало евангелизма,	Oracle!
Как	развивалась	ситуация
45 @23derevo
Хронология событий
• JEP	200:	The	Modular	JDK
- Mark	Reinhold	выступил	на Devoxx 2014
• Пост	на blog.dripstat.com
• Chris	Engelbert из	Hazelcast начал	дискуссию
46 @23derevo
Хронология событий
• JEP	200:	The	Modular	JDK
- Mark	Reinhold	выступил	на Devoxx 2014
• Пост	на blog.dripstat.com
• Chris	Engelbert из	Hazelcast начал	дискуссию
• Обсуждение	на	JCrete
47 @23derevo
Хронология событий
• JEP	200:	The	Modular	JDK
- Mark	Reinhold	выступил	на Devoxx 2014
• Пост	на blog.dripstat.com
• Chris	Engelbert из	Hazelcast начал	дискуссию
• Обсуждение	на	JCrete
• Mark	Reinhold	выступил	на	JVMLS
• JEP	260:	Encapsulate	Most	Internal	APIs
• JavaOne 2015	— 5	разъясняющих	презентаций
48 @23derevo
План замены Unsafe на public API
• Replacement	in	JDK	8	à hide	in	JDK	9
- sun.misc.BASE64Encoder	etc.
- Available	via	command-line	flag
49 @23derevo
План замены Unsafe на public API
• Replacement	in	JDK	8	à hide	in	JDK	9
- sun.misc.BASE64Encoder	etc.
- Available	via	command-line	flag
• No	replacement	in	JDK	8	à available	outside
- sun.misc.Unsafe,	sun.reflect.ReflectionFactory
- sun.misc.Cleaner,	sun.misc.SignalHandler
50 @23derevo
План замены Unsafe на public API
• Replacement	in	JDK	8	à hide	in	JDK	9
- sun.misc.BASE64Encoder	etc.
- Available	via	command-line	flag
• No	replacement	in	JDK	8	à available	outside
- sun.misc.Unsafe,	sun.reflect.ReflectionFactory
- sun.misc.Cleaner,	sun.misc.SignalHandler
• Replacement	in	JDK	9	à hide	in	JDK	9,	remove	in	JDK	10
Что	приходит	на	замену
JEP 193: VarHandles (Expected in Java 9)
class Queue {
int size;
...
}
VarHandle queueSize
= VarHandles.lookup().findFieldHandle(
Queue.class, "size", int.class);
queueSize.addAndGet(10);
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);
54 @23derevo
Итоги
• Oracle	услышал	сообщество	и	изменил	планы
- Oracle	готов	и	дальше	слушать
- Сообщество	представляет	собой	силу,	
за	ним	экосистема
• Unsafe	все-таки	выпилят
- Но	постепенно,	в	течение	нескольких	лет
55 @23derevo
Полезные материалы
• Mark	Reinhold	@	JVMLS	2015
- https://youtu.be/4HG0YQVy8UM
• Paul	Sandoz	@	JavaOne 2015
- http://cr.openjdk.java.net/~psandoz/conferences
/2015-JavaOne/j1-2015-unsafe-CON7076.pdf
• Andrei	Pangin @	Joker	2015
- http://www.slideshare.net/AndreiPangin/do-we-
need-unsafe-in-java
56 @23derevo
Development @ Одноклассники
• Tech	Blog
- http://habrahabr.ru/company/odnoklassniki
• Open	source
- https://github.com/odnoklassniki
• Career
- http://v.ok.ru
Благодарю	Андрея	Паньгина
@AndreiPangin
Вопросы	и	ответы
Спасибо	за	внимание!
@23derevo
alexey.fyodorov@corp.mail.ru

More Related Content

What's hot

Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийMikhail Shcherbakov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассникахodnoklassniki.ru
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 

What's hot (20)

Bytecode
BytecodeBytecode
Bytecode
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Zagursky
ZagurskyZagursky
Zagursky
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 

Similar to Unsafe: to be or to be removed?

Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Mail.ru Group
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераodnoklassniki.ru
 
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинПроект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинEYevseyeva
 
Модули в Java
Модули в JavaМодули в Java
Модули в JavaZheka Kozlov
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrencyPavel Titkov
 
Разработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, ShturmannРазработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, Shturmannyaevents
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013Vladimir Ivanov
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4HighLoad2009
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Anton Arhipov
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Полезное покрытие кода
Полезное покрытие кодаПолезное покрытие кода
Полезное покрытие кодаSQALab
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
Методы защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходМетоды защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходPositive Hack Days
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9JavaDayUA
 

Similar to Unsafe: to be or to be removed? (20)

Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
Дмитрий Юницкий. «Android NDK или как я перестал бояться и полюбил нативную р...
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервера
 
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей ПаньгинПроект «Одноклассники» Mail.Ru Group, Андрей Паньгин
Проект «Одноклассники» Mail.Ru Group, Андрей Паньгин
 
Модули в Java
Модули в JavaМодули в Java
Модули в Java
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
 
Разработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, ShturmannРазработка приложений для Android на С++. Юрий Береза, Shturmann
Разработка приложений для Android на С++. Юрий Береза, Shturmann
 
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
"Invokedynamic: роскошь или необходимость?"@ JavaOne Moscow 2013
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
 
Scala Rock-Painting
Scala Rock-PaintingScala Rock-Painting
Scala Rock-Painting
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Полезное покрытие кода
Полезное покрытие кодаПолезное покрытие кода
Полезное покрытие кода
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
New Android NDK & JNI
New Android NDK & JNINew Android NDK & JNI
New Android NDK & JNI
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Методы защиты Java-приложений и их обход
Методы защиты Java-приложений и их обходМетоды защиты Java-приложений и их обход
Методы защиты Java-приложений и их обход
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 

More from Alexey Fyodorov

Non-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmNon-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmAlexey Fyodorov
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуAlexey Fyodorov
 
Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Alexey Fyodorov
 
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itAlexey Fyodorov
 
Синхронизация без блокировок и СМС
Синхронизация без блокировок и СМССинхронизация без блокировок и СМС
Синхронизация без блокировок и СМСAlexey Fyodorov
 
Общество Мертвых Потоков
Общество Мертвых ПотоковОбщество Мертвых Потоков
Общество Мертвых ПотоковAlexey Fyodorov
 
JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!Alexey Fyodorov
 
Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Alexey Fyodorov
 
Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Alexey Fyodorov
 
Процесс изменения платформы Java
Процесс изменения платформы JavaПроцесс изменения платформы Java
Процесс изменения платформы JavaAlexey Fyodorov
 
Java: how to thrive in the changing world
Java: how to thrive in the changing worldJava: how to thrive in the changing world
Java: how to thrive in the changing worldAlexey Fyodorov
 

More from Alexey Fyodorov (13)

Non-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithmNon-blocking Michael-Scott queue algorithm
Non-blocking Michael-Scott queue algorithm
 
Помоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другуПомоги ближнему, или Как потоки помогают друг другу
Помоги ближнему, или Как потоки помогают друг другу
 
Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)Counter Wars (JEEConf 2016)
Counter Wars (JEEConf 2016)
 
Non-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need itNon-blocking synchronization — what is it and why we (don't?) need it
Non-blocking synchronization — what is it and why we (don't?) need it
 
Синхронизация без блокировок и СМС
Синхронизация без блокировок и СМССинхронизация без блокировок и СМС
Синхронизация без блокировок и СМС
 
Общество Мертвых Потоков
Общество Мертвых ПотоковОбщество Мертвых Потоков
Общество Мертвых Потоков
 
JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!JDK: CPU, PSU, LU, FR — WTF?!
JDK: CPU, PSU, LU, FR — WTF?!
 
Philosophers
PhilosophersPhilosophers
Philosophers
 
Java in Motion
Java in MotionJava in Motion
Java in Motion
 
Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)Java Platform Tradeoffs (Riga 2013)
Java Platform Tradeoffs (Riga 2013)
 
Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)Java Platform Tradeoffs (CEE SECR 2013)
Java Platform Tradeoffs (CEE SECR 2013)
 
Процесс изменения платформы Java
Процесс изменения платформы JavaПроцесс изменения платформы Java
Процесс изменения платформы Java
 
Java: how to thrive in the changing world
Java: how to thrive in the changing worldJava: how to thrive in the changing world
Java: how to thrive in the changing world
 

Unsafe: to be or to be removed?