Upload
go-tanaka
View
2.992
Download
5
Embed Size (px)
Citation preview
Java 8 HotSpot meeting
JVM内部の基本的な話
114年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
自己紹介
@tan_go238
PLUGRAM, Inc.
214年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
もくじ
・コマンドライン引数・OOPとか・Object Locking・Compressed OOP
・Java8での変更点
314年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
コマンドライン引数
414年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
コマンドライン引数
コマンドライン引数は3種類
standard option
non-standard options
developer options
514年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
すべてのJVM実装で利用できるリリース間の動作も安定している
コマンドライン引数は3種類
standard option
non-standard options
developer options
コマンドライン引数
614年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
java -client -verbose:gc Hello
コマンドライン引数は3種類
standard option
non-standard options
developer options
コマンドライン引数
714年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
-X で始まるすべてのJVM実装で動くことが保証されていない
予告なく変更されることがある
コマンドライン引数は3種類
standard option
non-standard options
developer options
コマンドライン引数
814年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
java -Xms512m -Xmx512m Hello
コマンドライン引数は3種類
standard option
non-standard options
developer options
コマンドライン引数
914年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
-XX で始まる正しく動作させるために特定のシステム条件が必要になる場合があるシステム設定パラメータにアクセスできないと使えない場合がある
普通は使わない。予告なく変更されることがある
コマンドライン引数は3種類
standard option
non-standard options
developer options
コマンドライン引数
1014年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
コマンドライン引数は3種類
standard option
non-standard options
developer options
java -client -Xbatch -XX:+PrintIRWithLIR Hello
コマンドライン引数
1114年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
% java -client -Xbatch -XX:+PrintIRWithLIR HelloError: VM option 'PrintIRWithLIR' is notproduct and is available only in debug version of VM.Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.
一部のコマンドライン引数を使うにはデバッグ版のJVMが必要になる
コマンドライン引数
1214年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
% hg clone http://hg.openjdk.java.net/jdk8/jdk8 jdk8_src% cd jdk8_src% ./get_source.sh% bash ./configure --enable-debug --with-target-bits=64% make all
OpenJDKをビルドする
たった5行!(帰ってからやってね!)
1314年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
% /usr/local/bin/java -client -Xbatch -XX:+PrintIRWithLIR Hello__bci__use__tid____instr____________________________________. 0 0 34 B7 [0, 0] -> B8 sux: B8
label [label:0x3c03ffc8]. 0 0 37 std entry B8 std_entry move [rsi|L] [R177|L] move [metadata:0xa1e80068|M] [R178|M] move [Base:[R178|M] Disp: 108|I] [R179|I] add [R179|I] [int:8|I] [R179|I] move [R179|I] [Base:[R178|M] Disp: 108|I] move [metadata:0xa1c8a048|M] [R180|M] logic_and [R179|I] [int:8184|I] [R179|I] cmp [R179|I] [int:0|I] branch [EQ] [CounterOverflowStub: 0x3c043ba8] label [label:0x3c043bd0] branch [AL] [B8]
OpenJDKをビルドする
1414年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
OOPとか
1514年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
OOP(Ordinary Object Pointer)
・ヒープ上の全てのJavaオブジェクトはOOPとして表現される
・OOPはC/C++のポインタ(マシン語)でヒープ内の位置を指す
・OOPのヘッダーは Mark と Klass の2マシン語(ポインタ※)
・”Mark”はGC、同期化のための情報をもっている
・”Klass”はクラスのメタデータへのポインタ
※Markはポインタではない(後述)
1614年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
OOP(Ordinary Object Pointer)hotspot/src/share/vm/oops/oop.hpp (JDK7)
class oopDesc { friend class VMStructs; private: volatile markOop _mark; union _metadata { wideKlassOop _klass; narrowOop _compressed_klass; } _metadata;
typedef class klassOopDesc* wideKlassOop;
hotspot/src/share/vm/oops/oopsHierarchy.hpp (JDK7)
1714年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
oopDesc
hotspot/src/share/vm/oops/oop.hpp (JDK7)
// oopDesc is the top baseclass for objects classes. The {name}Desc classes describe// the format of Java objects so the fields can be accessed from C++.// oopDesc is abstract.// (see oopHierarchy for complete oop class hierarchy)
oopDescクラスはGC対象となるオブジェクトの抽象的な基底クラスoopDescクラスを継承したクラスのインスタンスがGC対象のオブジェクトになる
1814年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
oopDesc
hotspot/src/share/vm/oops/oopsHierarcy.hpp (JDK7)
typedef class oopDesc* oop;typedef class instanceOopDesc* instanceOop;typedef class methodOopDesc* methodOop;typedef class constMethodOopDesc* constMethodOop;typedef class methodDataOopDesc* methodDataOop;typedef class arrayOopDesc* arrayOop;typedef class objArrayOopDesc* objArrayOop;typedef class typeArrayOopDesc* typeArrayOop;typedef class constantPoolOopDesc* constantPoolOop;typedef class constantPoolCacheOopDesc* constantPoolCacheOop;typedef class klassOopDesc* klassOop;typedef class markOopDesc* markOop;typedef class compiledICHolderOopDesc* compiledICHolderOop;
oopDescクラスはGC対象となるオブジェクトの抽象的な基底クラスoopDescクラスを継承したクラスのインスタンスがGC対象のオブジェクトになる
1914年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
klassOopDesc・klassOopDescクラスはJava上のクラスを表す・Java上の「java.lang.String」は、VM上では klassOopDescクラスのインスタンス(klassOop)になる・全てのオブジェクトは klassOop を持っている
class oopDesc { friend class VMStructs; private: volatile markOop _mark; union _metadata { wideKlassOop _klass; narrowOop _compressed_klass; } _metadata;
typedef class klassOopDesc* wideKlassOop;
← oop.hpp (JDK7)↓ oopsHierarchy.hpp (JDK7)
2014年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
klassOop
klassOopはklassクラスのインスタンスを保持しているただの箱
// klassOop object layout:// [header ]// [klass_field]// [KLASS ]
hotspot/src/share/vm/oops/klassOop.hpp (JDK7)
2114年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Klass・Klassクラスはさまざまな型情報の抽象的な基底クラス・Klassの子クラスにはoopDescの子クラスと対応するクラスが存在する → XXDescのインスタンスには、XXDescに対応したXXKlassを 保持するklassOopが格納される
http://www.narihiro.info/g1gc-impl-book/object.html2214年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
OOPとKlassの関係
InstanceOopDesc_klass
InstanceOopDesc
InstanceKlass
InstanceOopDesc
InstanceKlassKlass
_klass
InstanceOop = str klassOop = String klassOop = Class
StringオブジェクトのOOP
2314年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
MarkOopDesc
MarkOopDescはOOPではなく1ワードのデータ
MarkOopDescの主な内容
・オブジェクトのハッシュ値 ・年齢(世代別GCに利用) ・ロックフラグ
同期化やGCに利用する
2414年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
MarkOopDesc// 64 bits:// --------
// unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object)// JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object)
// PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)// size:64 ----------------------------------------------------->| (CMS free block)//
// unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object)// JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object)
// narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object)// unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)
hotspot/src/share/vm/oops/markOop.hpp (JDK7)
2514年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Object Locking
https://wikis.oracle.com/display/HotSpotInternals/Synchronization
Biased Locking 基本ロック
2614年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
基本ロックLock状態への遷移1. Interpreter frameにBasicObjectLockを積む → ロックを表現2. 元の _mark の内容を _displaced_holderへ退避
3. _markはBasicLockの位置をCAS命令を使って 書込む
runtime/basicLock.hpp - BasicObjectLockinterpreter/interpreterRuntime.cpp - InterpreterRuntime::monitorenterruntime/synchronizer.cpp - ObjectSynchronizer::fast_enterruntime/synchronizer.cpp - ObjectSynchronizer::slow_enter
2714年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
基本ロック
inflate lockは省略・・・
異なる2つのスレッドからアクセスされた場合inflation処理が行われる
2814年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Biased Locking・基本ロックでは1回のロックで最低1回のCAS命令を使う
・Biased Lockingのコンセプト - あるスレッドからロックされたオブジェクトは、 同じスレッドからロックされる傾向がある。 - オブジェクトの中にスレッド情報を埋め込んで、 特定のスレッドに偏っている(biased)ことを示す。 それによりそのスレッドからのロックはCAS命令なし
で行うことができる。
2914年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
1. オブジェクトの生成時は anonymously biased2. 最初のスレッドがロックすると、そのスレッドのbiasがかかる(CAS操作が必要)3. Biasedのかかったスレッドがロックする場合は _mark に変更が不要4. ロックの衝突などが発生するとbiasをかけるのをやめて通常の状態に戻る → 以降、基本ロックを使用する
Biased Locking
3014年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
CompressedOOP
3114年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Compressed OOP
・OOPはオブジェクトに対するポインタを表す
・ポインタのサイズは通常ネイティブマシンと同じサイズになる
・LP64では 64ビット、ILP32では32ビット・ILP32では最大ヒープサイズが約4GBになる
・64ビットだとメモリ空間が広くなる代わりにオブジェクトの サイズが大きくなる(1.5倍必要になることも) →帯域幅、キャッシュの不足もあり単純に64bitにするのは厳しい
3214年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Compressed OOP
・圧縮OOPは32ビットの値で管理ポインタを表す
・圧縮OOPから参照先のオブジェクトを見つけるには 8倍して64ビットベースのアドレスに加算する必要がある・圧縮することにより最大約32GBのヒープサイズに対応
圧縮OOPはJava6u18からデフォルトでオン-XX:-UseCompressedOops で切ることができる
3314年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Compressed OOP・JDK7 + No CompressedOop
Address of SampleClass class is 0x10f03ad00
Memory layout of SampleClass object at 0x14af3edd8:==========================================================[0x0000]: 01 da b1 9b 66 00 00 00 00 ad 03 0f 01 00 00 00[0x0010]: 14 00 00 00 00 00 00 00 0a 00 00 00 00 00 00 00[0x0020]: 05 00 00 00 00 00 00 00==========================================================
Field Layout of SampleClass:==========================================================@16 8 SampleBaseClass.s@24 8 SampleClass.l@32 8 SampleClass.i@40 #shallowSizeOfInstance(SampleClass)==========================================================
[mark] ] 8 byte[klass pointer ] 8 byte (4 byte for compressed-oops)[fields ] values of all fields including fields from super classes
3414年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Compressed OOP
Address of SampleClass class is 0x108415f80
Memory layout of SampleClass object at 0x14556d498:==========================================================[0x0000]: 01 bc 00 6f 0a 00 00 00 f0 2b 08 21 14 00 00 00[0x0010]: 0a 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00==========================================================
Field Layout of SampleClass:==========================================================@12 4 SampleBaseClass.s@16 8 SampleClass.l@24 8 SampleClass.i@32 #shallowSizeOfInstance(SampleClass)==========================================================
[mark] ] 8 byte[klass pointer ] 8 byte (4 byte for compressed-oops)[fields ] values of all fields including fields from super classes
・JDK7 + CompressedOop
3514年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Compressed OOP
Address of SampleClass class is 0x600d71640
Memory layout of SampleClass object at 0x7ac44de48:==========================================================[0x0000]: 01 d0 f2 5e 1c 00 00 00 59 5c 03 f8 00 00 00 00[0x0010]: 14 00 00 00 00 00 00 00 0a 00 00 00 00 00 00 00[0x0020]: 05 00 00 00 00 00 00 00==========================================================
Field Layout of SampleClass:==========================================================@16 8 SampleBaseClass.l@24 8 SampleClass.l@32 8 SampleClass.i@40 #shallowSizeOfInstance(SampleClass)==========================================================
・JDK7 + CompressedOop(その2)
-‐XX:ObjectAlignmentInBytes=8http://www.slideshare.net/DawidWeiss/sizeofobject-how-much-memory-objects-take-on-jvms-and-when-this-may-matter
3614年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Compressed OOP
% java -Xbootclasspath/a:ocean-of-memories.jar -jar jol-internals.jar SampleClass
Running 64-bit HotSpot VM.Using compressed references with 3-bit shift.Objects are 8 bytes aligned.Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
SampleClass object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (0000 0001 0000 0000 0000 0000 0000 0000) 4 4 (object header) 00 00 00 00 (0000 0000 0000 0000 0000 0000 0000 0000) 8 4 (object header) 2d ec ed 20 (0010 1101 1110 1100 1110 1101 0010 0000) 12 2 short SampleBaseClass.s 20 14 2 (alignment/padding gap) N/A 16 8 long SampleClass.l 10 24 4 int SampleClass.i 5 28 4 (loss due to the next object alignment)Instance size: 32 bytes (estimated, add this JAR via -javaagent: to get accurate result)Space losses: 2 bytes internal + 4 bytes external = 6 bytes total
・JDK7 + CompressedOop
jol (Java Object Layout)
http://openjdk.java.net/projects/code-tools/jol/
3714年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Java8での変更点
3814年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Java8での変更点(今回読んでて気づいたところ)
OpenJDK 7
class oopDesc { friend class VMStructs; private: volatile markOop _mark; union _metadata { wideKlassOop _klass; narrowOop _compressed_klass; } _metadata;
class oopDesc { friend class VMStructs; private: volatile markOop _mark; union _metadata { Klass* _klass; narrowKlass _compressed_klass; } _metadata;
OpenJDK 8
hotspot/src/share/vm/oops/oop.hpp
3914年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Java8での変更点(今回読んでて気づいたところ)
hotspot/src/share/vm/oops/klass.hpp
OpenJDK 7
// Klass layout:// [header ] klassOop// [klass pointer ] klassOop// [C++ vtbl ptr ] (contained in Klass_vtbl)// [layout_helper ]// [super_check_offset ]// [secondary_super_cache]// [secondary_supers ]// [primary_supers 0]// [primary_supers 1]// [primary_supers 2]// ...
OpenJDK 8
// Klass layout:// [C++ vtbl ptr ] (contained in Metadata)// [layout_helper ]// [super_check_offset ]// [name ]// [secondary_super_cache]// [secondary_supers ]supertypes// [primary_supers 0]// [primary_supers 1]// [primary_supers 2]// ...
4014年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Java8での変更点(今回読んでて気づいたところ)
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/diff/da91efe96a93/src/share/vm/oops/instanceKlass.hpp
OpenJDK / jdk8u / jdk8u / hotspot
diff src/share/vm/oops/instanceKlass.hpp @ 3602:da91efe96a93
6964458: Reimplement class meta-data storage to use native memorySummary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, rolandContributed-by: jmasa <[email protected]>, stefank <[email protected]>, mgerdin <[email protected]>, never <[email protected]>
authorcoleenpdateSat, 01 Sep 2012 13:25:18 -0400 (2012-09-02)parents04ade88d9712children4735d2c84362
4114年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Java8での変更点(今回読んでて気づいたところ)
・Java8でmetaspaceが導入されたことにより
klassOopがなくなった
・oopDescクラスのKlassのポインタが直接 metaspace 内の
アドレスを指すのかはよくわかってない
4214年10月23日木曜日
ありがとうございました!
4314年10月23日木曜日
Java 8 HotSpotMeeting
COPYRIGHT 2014 PLUGRAM, INC.
Locking and Synchronization
参考
http://www.slideshare.net/nminoru_jp/jvm-readingsynchronization
徹底解剖「G1GC」実装編
https://github.com/authorNari/g1gc-impl-book/
OpenJDK Wikihttps://wiki.openjdk.java.net/dashboard.action
Dangerous Code: How to be Unsafe with Java Classes & Objects in Memoryhttp://zeroturnaround.com/rebellabs/dangerous-code-how-to-be-unsafe-with-java-classes-objects-in-memory/
4414年10月23日木曜日