JJUG ナイトセミナ 「Javaのプログラムはどうやって動いているの?」に参加してきました
JVM 編
JVM
Virtual Machine
- プログラミング言語を解釈しコンピュータで実行するソフトウェア
- Write Once, Run Anywhere
Java Virtual Machine
Classファイル
コンパイル
javap
mainを実行するまで
java Test を実行したら
- JVM起動
- JNI_CreateJavaVM()
- クラスロード
- Classファイルの読み込み
- 使用するクラスを芋づる式にロード
- java -verbose:class Test
- リンク
- Classファイルが正しいかチェック
- 改ざん・悪意のあるコードがないか
- staticフィールドの初期化
- ただしJavaのコードは実行しない
- finalでもnullが入る
- クラス間の関係を解決
- 継承やら型やら
- Classファイルが正しいかチェック
- 初期化
- staticフィールドの初期化
- Javaコードも実行
- staticイニシャライザの実行
- staticフィールドの初期化
- main実行
- mainメソッドの実行
バイトコードの実行
Stack
- Last In, First Out (LIFO)
- 途中の要素のアクセスはダメ
Stack Machine
- Java VM
- PostScript
- .NET Framework CLR
Register Machine
逆ポーランド記法
- 1 + 2 → 1 2 +
- (2 + 3) x 5 + (4 - 2) → 2 3 + 5 x 4 2 - +
- Stack Machineと相性が良い
メモリの状態
- スレッド毎にStackがある
- 他にはHeapとMetaspaceがある
- スタックオーバーフローはStackが溢れた状態
Conclusion
GC 編
Why to Use GC
GC (Garbage Collection)
- メモリの自動管理
- 不要になったメモリを自動的に回収
Before GC
- 自前でメモリ管理
- Cだとmalloc(), calloc(), realloc(), free()
問題点
- メモリ解放忘れ
- 二重解放
- 無効な参照
- メモリ周りのBUGは修正が難しい
最初のGC
Mark & Sweep GC
- 使用中のオブジェクトをマーク
- マークのないオブジェクトを解放
どうやってマークするか
- rootから参照を辿る
- 参照先から参照を辿る
未使用オブジェクトをFree Listへ
- 次にオブジェクトを配置するときはFree Listから探す
compactionでぶつ切れのFree Listを並べる
adv. & dis.
- adv.
- 実装がシンプル
- 参照の書き換えがないため安全 (if not Compaction)
- Dis.
- Stop-the-Worldの時間が長い
- ヒープの断片化がおきやすい (if not Compaction)
- CompactionをするとStop-the-Worldの時間が長くなる
Copy GC
- ヒープを二分割
- 使用する領域は一方のみ
- 片方から一方へオブジェクトをコピー
- スイープではなくコピーする
adv. & dis.
- adv.
- Stop-the-Worldの時間が短い
- ヒープの断片化がおきない
- 高速なアロケーション
- Dis.
- ヒープの使用効率が悪い
- 参照の書き換えがある
世代別GC
Javaで主に使われている
特徴
Conclusion
- M&S、Copy、世代別
- 60年代から全然変わらない
- 原理を知って、チューニングに活かす
- GCと仲良く
- GCに関しては以下の書籍が詳しい www.amazon.co.jp