SlideShare a Scribd company logo
1 of 89
Download to read offline
VarHandles
David Buck
日本オラクル株式会社
• JVM Sustaining Engineer
• OpenJDK 8 Update Project
Maintainer
• JavaOne Rock Star
• Co-author of Oracle WebLogic
Server 11g 構築・運用ガイド
• @DavidBuckJP
• https://blogs.oracle.com/buc
k/
Who am I? バック デイビッド(左)
今日触れる内容
• Java のメモリモデル
• MethodHandle
• sun.misc.Unsafe
• VarHandle
• ゴキブリホイホイ
Project Valhalla
Emil Doepler - Doepler, Emil. ca. 1905. Walhall, die Götterwelt der Germanen. Martin Oldenbourg, Berlin. Photographed by Haukurth cropped by Bloodofox, Public Domain
Project Loom
織機
By en:Yanagawa Shigenobu - This image is available from the United States Library of Congress's Prints and Photographs division under the digital ID jpd.00091. パブリック・ドメイン, https://commons.wikimedia.org/w/index.php?curid=3505580
Project Panama
パナマ運河
By US DOT - https://www.transportation.gov/fastlane/expanded-canal-means-an-expanded-economy, Public Domain, https://commons.wikimedia.org/w/index.php?curid=54989250
Project Valhalla
Emil Doepler - Doepler, Emil. ca. 1905. Walhall, die Götterwelt der Germanen. Martin Oldenbourg, Berlin. Photographed by Haukurth cropped by Bloodofox, Public Domain
Project Valhalla
Valhalla == VALue types
Project Valhalla
• Value Types (値型)
• Generic Specialization (ジェネリックの特殊化)
• VarHandles (JDK 9 でリリースされた)
Project Valhalla
• Value Types (値型)
• Generic Specialization (ジェネリックの特殊化)
• VarHandles (JDK 9 でリリースされた)
Project Valhalla
• Value Types (値型)
• Generic Specialization (ジェネリックの特殊化)
• VarHandles (JDK 9 でリリースされた)
余談その1(マイコン)
By Cbmeeks / processed by Pixel8 - Original uploader was Cbmeeks at en.wikipedia, CC 表示-継承 3.0, https://commons.wikimedia.org/w/index.php?curid=3672924
昔の BASIC 言語の魔法のキーワード
• PEEK
• 任意のメモリアドレスの値を取得する
• POKE
• 任意のメモリアドレスに任意の値を格納する
???
sun.misc.Unsafe
• JVM の内部機能を直接に呼び出す内部のインタフェース
• Java SE ライブラリを実現するためのもの
• Sun (Oracle) 以外の利用は想定外
• いろいろな機能
• 初期化せずに Heap メモリを取得
• PEEK / POKE
• Java MM より細かいメモリ操作
sun.misc.Unsafe
• Reflection
• Serialization
• NIO
• java.util.concurrent
• 暗号化・複合化
• BigDecimal / BigInteger
• Java2D
• CPU の使用率 (JMX)
内部利用
sun.misc.Unsafe
• JVM の内部機能を直接に呼び出す内部のインタフェース
• Java SE ライブラリを実現するためのもの
• Sun (Oracle) 以外の利用は想定外
• いろいろな機能
• 初期化せずに Heap メモリを取得
• PEEK / POKE
• Java MM より細かいメモリ操作
sun.misc.Unsafe
• JVM の内部機能を直接に呼び出す内部のインタフェース
• Java SE ライブラリを実現するためのもの
• Sun (Oracle) 以外の利用は想定外
• いろいろな機能
• 初期化せずに Heap メモリを取得
• PEEK / POKE
• Java MM より細かいメモリ操作
private static final Unsafe theUnsafe = new Unsafe();
public static Unsafe getUnsafe() {
Class cc = sun.reflect.Reflection.getCallerClass(2);
if (cc.getClassLoader() != null)
throw new SecurityException("Unsafe");
return theUnsafe;
}
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
unsafe = (Unsafe) f.get(null);
Unsafe Demo!
sun.misc.Unsafe
By Jared Tarbell - Flickr: sky puzzle, CC BY 2.0, https://commons.wikimedia.org/w/index.php?curid=31953973
JDK 9 – Project Jigsaw
sun.misc.Unsafe
• メモリ管理
• メモリレイアウト
• メモリアクセス
• Valhalla
• Panama
• Arrays 2.0
sun.misc.Unsafe
JVM / ネイティブを跨る処理 • Panama
• Foreign Function Interface
sun.misc.Unsafe
細かいメモリモデル Variable Handles
sun.misc.Unsafe
• JVM の内部機能を直接に呼び出す内部のインタフェース
• Java SE ライブラリを実現するためのもの
• Sun (Oracle) 以外の利用は想定外
• いろいろな機能
• 初期化せずに Heap メモリを取得
• PEEK / POKE
• Java MM より細かいメモリ操作
sun.misc.Unsafe
• JVM の内部機能を直接に呼び出す内部のインタフェース
• Java SE ライブラリを実現するためのもの
• Sun (Oracle) 以外の利用は想定外
• いろいろな機能
• 初期化せずに Heap メモリを取得
• PEEK / POKE
• Java MM より細かいメモリ操作
JEP 193: Variable Handles
• C11/C++11 のメモリモデルに合わせる
• j.u.c の atomic のような変数の変更も出来る
• sun.misc.Unsafe のメモリアクセスの API をリプレース
JEP 193: Variable Handles
• C11/C++11 のメモリモデルに合わせる
• j.u.c の atomic のような変数の変更も出来る
• sun.misc.Unsafe のメモリアクセスの API をリプレース
C++ メモリモデル
• C++11 で導入された
• Atomic メモリアクセス (std::atomic)
• Happens-before (std::memory_order)
typedef enum memory_order {
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst
} memory_order;
C++ メモリモデル
• 従来の Java のメモリモデルより細かい
• データの単位ではなく
• アクセスの単位で決める
• 他の言語などで導入されれている傾向がある
JEP 193: Variable Handles
• C11/C++11 のメモリモデルに合わせる
• j.u.c の atomic のような変数の変更も出来る
• sun.misc.Unsafe のメモリアクセスの API をリプレース
class Counter {
private int c = 0;
public void increment() { c++; }
public void decrement() { c--; }
public int value() { return c; }
}
volatile int c = 0;
void increment() {
c++;
}
volatile int c = 0;
void increment() {
c++;
}
reg = [id]
reg++
[id] = reg
スレッド1
reg = [id] // reg==3
reg++ // reg==4
[id] = reg // id==4
スレッド2
reg = [id] // reg==3
reg++ // reg==4
[id] = reg // id==4
class Counter {
private int c = 0;
public void increment() { c++; }
public void decrement() { c--; }
public int value() { return c; }
}
class SynchronizedCounter {
private int c = 0;
public synchronized void increment() { c++; }
public synchronized void decrement() { c--; }
public synchronized int value() { return c; }
}
余談その2 ゴキブリホイホイ
obj.a = 1;
obj.b = 2;
synchronized(this) {
obj.c = 3;
obj.d = 4;
}
obj.e = 5;
obj.f = 6;
余談その2 ゴキブリホイホイ
obj.a = 1;
obj.b = 2;
synchronized(this) {
obj.c = 3;
obj.d = 4;
}
obj.e = 5;
obj.f = 6;
obj.a = 1;
synchronized(this) {
obj.b = 2;
obj.c = 3;
obj.d = 4;
obj.e= 5;
}
obj.f=6;
余談その2 ゴキブリホイホイ
obj.a = 1;
obj.b = 2;
synchronized(this) {
obj.c = 3;
obj.d = 4;
}
obj.e = 5;
obj.f = 6;
obj.a = 1;
synchronized(this) {
obj.b = 2;
obj.c = 3;
obj.d = 4;
obj.e= 5;
}
obj.f=6;
import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
private AtomicInteger c = new AtomicInteger(0);
public void increment() { c.incrementAndGet(); }
public void decrement() { c.decrementAndGet(); }
public int value() { return c.get(); }
}
Field データ
Class ポインター
ロック情報 hashcode ・その他
class Counter {
private int c = 0;
public void increment() { c++; }
public void decrement() { c--; }
public int value() { return c; }
}
Counter
c
Class ポインター
ロック情報 hashcode ・その他
import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
private AtomicInteger c = new AtomicInteger(0);
public void increment() { c.incrementAndGet(); }
public void decrement() { c.decrementAndGet(); }
public int value() { return c.get(); }
}
AtomicCounter
c
Class ポインター
ロック情報 hashcode ・その他
value
Class ポインター
ロック情報 hashcode ・その他
AtomicCounter AtomicInteger
class BadCounter {
private int c = 0;
public void increment() {
unsafe.getAndAddInt(this, valueOffset, 1);
}
public void decrement() {
unsafe.getAndAddInt(this, valueOffset, -1);
}
public int value() { return c; }
}
static {
// get unsafe
try {
valueOffset = unsafe.objectFieldOffset
(BadCounter.class.getDeclaredField(“c"));
} catch (Exception ex) { throw new Error(ex); }
}
static {
// get unsafe
try {
valueOffset = unsafe.objectFieldOffset
(BadCounter.class.getDeclaredField(“c"));
} catch (Exception ex) { throw new Error(ex); }
}
VarHandle 登場!
VarHandle を理解するには
VarHandle を理解するには
MethodHandle の知識は不可欠!
Da Vinci Machine Project
• Java 以外の言語を使っても、JVM はいい仮想マシン
• パフォーマンスがいい
• ポータビリティー(移植性)
• セキュリティ(バイトコード)
• 既存のフレームワークやライブラリ
By Web Gallery of Art: Image Info about artwork, Public Domain, https://commons.wikimedia.org/w/index.php?curid=15497207
Java Code
言語ランタイムとは
57
JVM
OS
Java
Class
Library
JRuby Runtime
JVM
OS
Java
Class
Library
Ruby Code
MethodHandle
58
int foo()Method Handle
59
private void doStuff();
descriptor: ()V
flags: ACC_PRIVATE
Code:
stack=2, locals=2,
args_size=1
0: new #7
3: dup
4: invokespecial #8
7: astore_1
8: aload_1
9: aload_0
10: invokedynamic #9, 0
15: invokevirtual #10
18: return
60
private void doStuff();
descriptor: ()V
flags: ACC_PRIVATE
Code:
stack=2, locals=2,
args_size=1
0: new #7
3: dup
4: invokespecial #8
7: astore_1
8: aload_1
9: aload_0
10: invokedynamic #9, 0
15: invokevirtual #10
18: return
BootStrap Method
61
private void doStuff();
descriptor: ()V
flags: ACC_PRIVATE
Code:
stack=2, locals=2,
args_size=1
0: new #7
3: dup
4: invokespecial #8
7: astore_1
8: aload_1
9: aload_0
10: invokedynamic #9, 0
15: invokevirtual #10
18: return
BootStrap Method
int foo()
62
private void doStuff();
descriptor: ()V
flags: ACC_PRIVATE
Code:
stack=2, locals=2,
args_size=1
0: new #7
3: dup
4: invokespecial #8
7: astore_1
8: aload_1
9: aload_0
10: invokedynamic #9, 0
15: invokevirtual #10
18: return
BootStrap Method
int foo()
CS
63
private void doStuff();
descriptor: ()V
flags: ACC_PRIVATE
Code:
stack=2, locals=2,
args_size=1
0: new #7
3: dup
4: invokespecial #8
7: astore_1
8: aload_1
9: aload_0
10: invokedynamic #9, 0
15: invokevirtual #10
18: return
int foo()
CS
64
private void doStuff();
descriptor: ()V
flags: ACC_PRIVATE
Code:
stack=2, locals=2,
args_size=1
0: new #7
3: dup
4: invokespecial #8
7: astore_1
8: aload_1
9: aload_0
10: invokedynamic #9, 0
15: invokevirtual #10
18: return
int foo()
CS int bar()
65
private void doStuff();
descriptor: ()V
flags: ACC_PRIVATE
Code:
stack=2, locals=2,
args_size=1
0: new #7
3: dup
4: invokespecial #8
7: astore_1
8: aload_1
9: aload_0
10: invokedynamic #9, 0
15: invokevirtual #10
18: return
int foo()
CS int bar()Method Handle
MethodHandle
• 関数ポインター
MethodHandle
• 関数ポインター
• Reflection API の代わりに利用出来る場合がある
• Field のアクセス(読み込み・書き込み)
• その他
• 例外を投げる
• 定数を返す
• など
MethodHandle の魅力
• 生成時のアクセスチェック
• setuid のような動き
• シグネチャ・ポリモーフィズム
シグネチャ・ポリモーフィズム
• すべてオブジェクトで渡す必要はない
• JVM と javac によって特別な扱い
• MethodHandle
• VarHandle
public class Receiver {
private volatile String vfield;
private static final MethodHandle
MH_GETTER_V_FIELD;
private static final MethodHandle
MH_SETTER_V_FIELD;
static { try {
MH_GETTER_V_FIELD =
MethodHandles.lookup().findGetter(Receiver.class,
"vfield", String.class);
MH_SETTER_V_FIELD =
MethodHandles.lookup().findSetter(Receiver.class,
"vfield", String.class);
} catch (Exception e) {
throw new Error(e);
}
}
}
public void setValue(String s) {
try {
MH_SETTER_V_FIELD.invokeExact(this, s);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
public String getValue() {
try {
return (String)
MH_GETTER_V_FIELD.invokeExact(this);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
} // class Receiver
public void setValue(java.lang.String);
descriptor: (Ljava/lang/String;)V
flags: ACC_PUBLIC
Code:
stack=3, locals=3, args_size=2
0: getstatic #2 // Field
MH_SETTER_V_FIELD:Ljava/lang/invoke/MethodHandle;
3: aload_0
4: aload_1
5: invokevirtual #3 // Method
java/lang/invoke/MethodHandle.invokeExact:(LReceiver;Ljava/lang/String;)V
8: goto 21
11: astore_2
12: new #5 // class java/lang/RuntimeException
15: dup
16: aload_2
17: invokespecial #6 // Method
java/lang/RuntimeException."<init>":(Ljava/lang/Throwable;)V
20: athrow
21: return
public void setValue(java.lang.String);
descriptor: (Ljava/lang/String;)V
flags: ACC_PUBLIC
Code:
stack=3, locals=3, args_size=2
0: getstatic #2 // Field
MH_SETTER_V_FIELD:Ljava/lang/invoke/MethodHandle;
3: aload_0
4: aload_1
5: invokevirtual #3 // Method
java/lang/invoke/MethodHandle.invokeExact:(LReceiver;Ljava/lang/String;)V
8: goto 21
11: astore_2
12: new #5 // class java/lang/RuntimeException
15: dup
16: aload_2
17: invokespecial #6 // Method
java/lang/RuntimeException."<init>":(Ljava/lang/Throwable;)V
20: athrow
21: return
public java.lang.String getValue();
descriptor: ()Ljava/lang/String;
flags: ACC_PUBLIC
Code:
stack=3, locals=2, args_size=1
0: getstatic #7 // Field
MH_GETTER_V_FIELD:Ljava/lang/invoke/MethodHandle;
3: aload_0
4: invokevirtual #8 // Method
java/lang/invoke/MethodHandle.invokeExact:(LReceiver;)Ljava/lang/String;
7: areturn
8: astore_1
9: new #5 // class java/lang/RuntimeException
12: dup
13: aload_1
14: invokespecial #6 // Method
java/lang/RuntimeException."<init>":(Ljava/lang/Throwable;)V
17: athrow
public java.lang.String getValue();
descriptor: ()Ljava/lang/String;
flags: ACC_PUBLIC
Code:
stack=3, locals=2, args_size=1
0: getstatic #7 // Field
MH_GETTER_V_FIELD:Ljava/lang/invoke/MethodHandle;
3: aload_0
4: invokevirtual #8 // Method
java/lang/invoke/MethodHandle.invokeExact:(LReceiver;)Ljava/lang/String;
7: areturn
8: astore_1
9: new #5 // class java/lang/RuntimeException
12: dup
13: aload_1
14: invokespecial #6 // Method
java/lang/RuntimeException."<init>":(Ljava/lang/Throwable;)V
17: athrow
class VHCounter {
private int c = 0;
public void increment() {
for (;;) {
int current = get();
int next = current + 1;
if (VH.compareAndSet(this, current, next))
return;
}
}
public void decrement() {
for (;;) {
int current = get();
int next = current - 1;
if (VH.compareAndSet(this, current, next))
return;
}
}
public int get() {
return (int)VH.get(this);
}
static {
try {
MethodHandles.Lookup l = MethodHandles.lookup();
VALUE = l.findVarHandle(VHCounter.class, “c",
Object.class);
} catch (ReflectiveOperationException e) {
throw new ExceptionInInitializerError(e);
}
}
} // VHCounter class
JEP 193: Variable Handles
• C11/C++11 のメモリモデルに合わせる
• j.u.c の atomic のような変数の変更も出来る
• sun.misc.Unsafe のメモリアクセスの API をリプレース
int data = 0;
boolean ready = false;
void hoge3() {
while (!ready) {};
assert data == 42;
}
void hoge4() {
data = 42;
ready = true;
}
int data = 0;
boolean ready = false;
void hoge3() {
while (!ready) {};
assert data == 42;
}
void hoge4() {
data = 42;
ready = true;
}
JSR-133 の volatile
void hoge4() {
data = 42;
ready = true;
}
void hoge3() {
while (!ready) {};
assert data ==
42;
}
volatile boolean ready = false;
VarHandle や Unsafe だと
• 必要な時だけ volatile としてアクセスすることが出来る
要は
• VarHandle は普段利用されない(Unsafe のように)
• MethodHandle はかなり役に立つ
• sun.misc.Unsafe などの内部APIが利用出来なくなる
Thank You!
参考
OpenJDK Project Page
http://openjdk.java.net/projects/valhalla/
JEP 193: Variable Handles
http://openjdk.java.net/jeps/193
VarHandle API
https://docs.oracle.com/javase/10/docs/api/index.html?java/lang/invoke/VarHan
dle.html
JVM Language Summit
http://openjdk.java.net/projects/mlvm/jvmlangsummit/

More Related Content

What's hot

㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみようNishida Kansuke
 
GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなしMITSUNARI Shigeo
 
KLab勉強会#6 発表資料
KLab勉強会#6 発表資料KLab勉強会#6 発表資料
KLab勉強会#6 発表資料Suguru Oho
 
UniRxことはじめ
UniRxことはじめUniRxことはじめ
UniRxことはじめShoichi Yasui
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another sideKiwamu Okabe
 
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript DevelopersTomomi Imura
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Languagey_taka_23
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワルAndrosia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワルCODE BLUE
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Yuichi Sakuraba
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin LongCODE BLUE
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsYoshifumi Kawai
 

What's hot (20)

㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう㉞cocos2d-xの開発環境をインストールしてみよう
㉞cocos2d-xの開発環境をインストールしてみよう
 
GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなし
 
KLab勉強会#6 発表資料
KLab勉強会#6 発表資料KLab勉強会#6 発表資料
KLab勉強会#6 発表資料
 
UniRxことはじめ
UniRxことはじめUniRxことはじめ
UniRxことはじめ
 
Open modeler
Open modelerOpen modeler
Open modeler
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Language
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワルAndrosia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット・アンワル
 
C++勉強会
C++勉強会C++勉強会
C++勉強会
 
Memory sanitizer
Memory sanitizerMemory sanitizer
Memory sanitizer
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
[CB16] マイクロソフトウィンドウズカーネルのデスノート by Peter Hlavaty & Jin Long
 
Slide
SlideSlide
Slide
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
Kernel fcache-bug
Kernel fcache-bugKernel fcache-bug
Kernel fcache-bug
 

Similar to Var handles jjug_ccc_spring_2018

EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするKiyoshi Sawada
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019David Buck
 
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ  JVM 特集  2015年8月]HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ  JVM 特集  2015年8月]
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]David Buck
 
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]David Buck
 
Project Loom + Project Panama
Project Loom + Project PanamaProject Loom + Project Panama
Project Loom + Project PanamaYuichi Sakuraba
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするKiyoshi Sawada
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 
Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!YujiSoftware
 
EmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよEmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよKiwamu Okabe
 
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]David Buck
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めようAdvancedTechNight
 
pi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマーpi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマーkunihikokaneko1
 
Rookの基礎・バージョンアップ
Rookの基礎・バージョンアップRookの基礎・バージョンアップ
Rookの基礎・バージョンアップTakashi Sogabe
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)Iwana Chan
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 

Similar to Var handles jjug_ccc_spring_2018 (20)

EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019Valhalla Update JJUG CCC Spring 2019
Valhalla Update JJUG CCC Spring 2019
 
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ  JVM 特集  2015年8月]HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ  JVM 特集  2015年8月]
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]
 
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
 
Project Loom + Project Panama
Project Loom + Project PanamaProject Loom + Project Panama
Project Loom + Project Panama
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!Java をクラッシュさせて遊んでみよう!
Java をクラッシュさせて遊んでみよう!
 
EmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよEmacsとGlossでお絵描きしてみるよ
EmacsとGlossでお絵描きしてみるよ
 
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
 
pi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマーpi-12. 時間, スリープ, 疑似乱数, タイマー
pi-12. 時間, スリープ, 疑似乱数, タイマー
 
Rookの基礎・バージョンアップ
Rookの基礎・バージョンアップRookの基礎・バージョンアップ
Rookの基礎・バージョンアップ
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Cve 2013-0422
Cve 2013-0422Cve 2013-0422
Cve 2013-0422
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 

More from David Buck

JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...David Buck
 
Java Bytecode Crash Course [Code One 2019]
Java Bytecode Crash Course [Code One 2019]Java Bytecode Crash Course [Code One 2019]
Java Bytecode Crash Course [Code One 2019]David Buck
 
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...David Buck
 
invokedynamic for Mere Mortals [Code One 2019]
invokedynamic for Mere Mortals [Code One 2019]invokedynamic for Mere Mortals [Code One 2019]
invokedynamic for Mere Mortals [Code One 2019]David Buck
 
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...David Buck
 
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]David Buck
 
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]David Buck
 
Z Garbage Collector
Z Garbage CollectorZ Garbage Collector
Z Garbage CollectorDavid Buck
 
JDK 10 へようこそ
JDK 10 へようこそJDK 10 へようこそ
JDK 10 へようこそDavid Buck
 
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]David Buck
 
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]David Buck
 
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]David Buck
 
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]David Buck
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]David Buck
 
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]David Buck
 
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]David Buck
 
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]David Buck
 
Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584]
Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584] Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584]
Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584] David Buck
 
Everything You Wanted to Know About JIT Compilation but Were Afraid to Ask [J...
Everything You Wanted to Know About JIT Compilation but Were Afraid to Ask [J...Everything You Wanted to Know About JIT Compilation but Were Afraid to Ask [J...
Everything You Wanted to Know About JIT Compilation but Were Afraid to Ask [J...David Buck
 
Full Speed Ahead! (Ahead-of-Time Compilation for Java SE) [JavaOne 2017 CON3738]
Full Speed Ahead! (Ahead-of-Time Compilation for Java SE) [JavaOne 2017 CON3738]Full Speed Ahead! (Ahead-of-Time Compilation for Java SE) [JavaOne 2017 CON3738]
Full Speed Ahead! (Ahead-of-Time Compilation for Java SE) [JavaOne 2017 CON3738]David Buck
 

More from David Buck (20)

JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
 
Java Bytecode Crash Course [Code One 2019]
Java Bytecode Crash Course [Code One 2019]Java Bytecode Crash Course [Code One 2019]
Java Bytecode Crash Course [Code One 2019]
 
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
 
invokedynamic for Mere Mortals [Code One 2019]
invokedynamic for Mere Mortals [Code One 2019]invokedynamic for Mere Mortals [Code One 2019]
invokedynamic for Mere Mortals [Code One 2019]
 
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
 
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
 
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
 
Z Garbage Collector
Z Garbage CollectorZ Garbage Collector
Z Garbage Collector
 
JDK 10 へようこそ
JDK 10 へようこそJDK 10 へようこそ
JDK 10 へようこそ
 
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
 
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
 
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
 
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
 
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
 
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
 
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
 
Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584]
Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584] Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584]
Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584]
 
Everything You Wanted to Know About JIT Compilation but Were Afraid to Ask [J...
Everything You Wanted to Know About JIT Compilation but Were Afraid to Ask [J...Everything You Wanted to Know About JIT Compilation but Were Afraid to Ask [J...
Everything You Wanted to Know About JIT Compilation but Were Afraid to Ask [J...
 
Full Speed Ahead! (Ahead-of-Time Compilation for Java SE) [JavaOne 2017 CON3738]
Full Speed Ahead! (Ahead-of-Time Compilation for Java SE) [JavaOne 2017 CON3738]Full Speed Ahead! (Ahead-of-Time Compilation for Java SE) [JavaOne 2017 CON3738]
Full Speed Ahead! (Ahead-of-Time Compilation for Java SE) [JavaOne 2017 CON3738]
 

Var handles jjug_ccc_spring_2018