12. Java 8 HotSpotMeeting
コマンドライン引数
% java -client -Xbatch -XX:+PrintIRWithLIR Hello
Error: 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が必要になる
COPYRIGHT 2014 PLUGRAM, INC.
14年10月23日木曜日12
13. Java 8 HotSpotMeeting
OpenJDKをビルドする
% 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
COPYRIGHT 2014 PLUGRAM, INC.
たった5行!
(帰ってからやってね!)
14年10月23日木曜日13
16. Java 8 HotSpotMeeting
OOP(Ordinary Object Pointer)
・ヒープ上の全てのJavaオブジェクトはOOPとして表現される
・OOPはC/C++のポインタ(マシン語)でヒープ内の位置を指す
・OOPのヘッダーは Mark と Klass の2マシン語(ポインタ※)
・”Mark”はGC、同期化のための情報をもっている
・”Klass”はクラスのメタデータへのポインタ
COPYRIGHT 2014 PLUGRAM, INC.
※Markはポインタではない(後述)
14年10月23日木曜日16
17. Java 8 HotSpotMeeting
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;
hotspot/src/share/vm/oops/oopsHierarchy.hpp (JDK7)
typedef class klassOopDesc* wideKlassOop;
COPYRIGHT 2014 PLUGRAM, INC.
14年10月23日木曜日17
18. Java 8 HotSpotMeeting
oopDesc
oopDescクラスはGC対象となるオブジェクトの抽象的な基底クラス
oopDescクラスを継承したクラスのインスタンスがGC対象のオブジェクトになる
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)
COPYRIGHT 2014 PLUGRAM, INC.
14年10月23日木曜日18
19. Java 8 HotSpotMeeting
oopDesc
oopDescクラスはGC対象となるオブジェクトの抽象的な基底クラス
oopDescクラスを継承したクラスのインスタンスがGC対象のオブジェクトになる
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;
COPYRIGHT 2014 PLUGRAM, INC.
14年10月23日木曜日19
20. Java 8 HotSpotMeeting
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;
COPYRIGHT 2014 PLUGRAM, INC.
← oop.hpp (JDK7)
↓ oopsHierarchy.hpp (JDK7)
typedef class klassOopDesc* wideKlassOop;
14年10月23日木曜日20
44. Java 8 HotSpotMeeting
参考
徹底解剖「G1GC」実装編
https://github.com/authorNari/g1gc-impl-book/
Locking and Synchronization
http://www.slideshare.net/nminoru_jp/jvm-readingsynchronization
OpenJDK Wiki
https://wiki.openjdk.java.net/dashboard.action
Dangerous Code: How to be Unsafe with Java Classes & Objects in Memory
http://zeroturnaround.com/rebellabs/dangerous-code-how-to-be-unsafe-with-java-classes-objects-in-memory/
COPYRIGHT 2014 PLUGRAM, INC.
14年10月23日木曜日44