SlideShare a Scribd company logo
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
• 任意のメモリアドレスに任意の値を格納する
Var handles jjug_ccc_spring_2018
???
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;
Var handles jjug_ccc_spring_2018
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

KEY
関ジャバ JavaOne Tokyo 2012報告会
Koichi Sakata
 
PDF
Kobe.R #15 - Incanter チョットシッテル
tnoda
 
PDF
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
 
PDF
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
 
PDF
VerilatorとSystemC
Mr. Vengineer
 
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Takefumi MIYOSHI
 
PDF
Async design with Unity3D
Kouji Hosoda
 
PDF
LINQ in Unity
Yoshifumi Kawai
 
関ジャバ JavaOne Tokyo 2012報告会
Koichi Sakata
 
Kobe.R #15 - Incanter チョットシッテル
tnoda
 
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
 
Reactive Extensionsで非同期処理を簡単に
Yoshifumi Kawai
 
VerilatorとSystemC
Mr. Vengineer
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Takefumi MIYOSHI
 
Async design with Unity3D
Kouji Hosoda
 
LINQ in Unity
Yoshifumi Kawai
 

What's hot (20)

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

Similar to Var handles jjug_ccc_spring_2018 (20)

PDF
Valhalla Update JJUG CCC Spring 2019
David Buck
 
PDF
Java 7 invokedynamic の概要
Taku Miyakawa
 
KEY
Java 並行処理の基礎update1
Kazuhiro Eguchi
 
PDF
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
David Buck
 
PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
JPCERT Coordination Center
 
PDF
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
 
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
PDF
Javaセキュアコーディングセミナー東京第1回 講義
JPCERT Coordination Center
 
PDF
JDK 10 へようこそ
David Buck
 
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
 
PDF
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
de:code 2017
 
PDF
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
なおき きしだ
 
PDF
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
NTT DATA Technology & Innovation
 
PDF
Javaにおけるデータシリアライズと圧縮
moai kids
 
PDF
gen-class とバイトコード(第3回 gen-class 勉強会資料)
tnoda
 
PDF
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
 
PDF
Look into Project Valhalla from CLR viewpoint
Logico
 
PDF
すごい Frege たのしく学ぼう!
y_taka_23
 
KEY
Actor&stm
潤一 加藤
 
PDF
InvokeDynamic at #shikadriven 2012
Go Tanaka
 
Valhalla Update JJUG CCC Spring 2019
David Buck
 
Java 7 invokedynamic の概要
Taku Miyakawa
 
Java 並行処理の基礎update1
Kazuhiro Eguchi
 
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
David Buck
 
Javaセキュアコーディングセミナー東京第1回演習の解説
JPCERT Coordination Center
 
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
 
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
NTT DATA Technology & Innovation
 
Javaセキュアコーディングセミナー東京第1回 講義
JPCERT Coordination Center
 
JDK 10 へようこそ
David Buck
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Chihiro Ito
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
de:code 2017
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
なおき きしだ
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
NTT DATA Technology & Innovation
 
Javaにおけるデータシリアライズと圧縮
moai kids
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
tnoda
 
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
 
Look into Project Valhalla from CLR viewpoint
Logico
 
すごい Frege たのしく学ぼう!
y_taka_23
 
Actor&stm
潤一 加藤
 
InvokeDynamic at #shikadriven 2012
Go Tanaka
 
Ad

More from David Buck (20)

PDF
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
David Buck
 
PDF
Java Bytecode Crash Course [Code One 2019]
David Buck
 
PDF
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
David Buck
 
PDF
invokedynamic for Mere Mortals [Code One 2019]
David Buck
 
PDF
Hangs, Slowdowns, Starvation—Oh My! A Deep Dive into the Life of a Java Threa...
David Buck
 
PDF
JDK Mission Control: Where We Are, Where We Are Going [Code One 2019]
David Buck
 
PDF
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
David Buck
 
PDF
Z Garbage Collector
David Buck
 
PDF
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
David Buck
 
PDF
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]
David Buck
 
PDF
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
David Buck
 
PDF
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
David Buck
 
PDF
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
David Buck
 
PDF
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
David Buck
 
PDF
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
David Buck
 
PDF
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
David Buck
 
PDF
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
David Buck
 
PDF
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
David Buck
 
PDF
Let’s Write Our Own Chip-8 Interpreter! [JavaOne 2017 CON3584]
David Buck
 
PDF
Everything You Wanted to Know About JIT Compilation but Were Afraid to Ask [J...
David Buck
 
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
David Buck
 
Java Bytecode Crash Course [Code One 2019]
David Buck
 
CSI (Crash Scene Investigation) HotSpot: Common JVM Crash Causes and Solution...
David Buck
 
invokedynamic for Mere Mortals [Code One 2019]
David Buck
 
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]
David Buck
 
Java Concurrency, A(nother) Peek Under the Hood [Code One 2019]
David Buck
 
Z Garbage Collector
David Buck
 
Java SE 8におけるHotSpotの進化 [Java Day Tokyo 2014 C-2]
David Buck
 
HotSpot のロック: A Peek Under the Hood [JJUG ナイトセミナ JVM 特集 2015年8月]
David Buck
 
Java Concurrency, A(nother) Peek Under the Hood [JavaOne 2016 CON1497]
David Buck
 
Bytecode Verification, the Hero That Java Needs [JavaOne 2016 CON1500]
David Buck
 
Java Debuggers: A Peek Under the Hood [JavaOne 2016 CON1503]
David Buck
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
David Buck
 
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
David Buck
 
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
David Buck
 
InvokeDynamic for Mere Mortals [JavaOne 2015 CON7682]
David Buck
 
HotSpot Synchronization, A Peek Under the Hood [JavaOne 2015 CON7570]
David Buck
 
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...
David Buck
 

Var handles jjug_ccc_spring_2018