概要
Java memory management | Dynatrace を読んだのでまとめました。
Java Memory Management
How Garbage Collection Really Works
- ガベージコレクションという言葉から、ゴミ集めをする実装だと思いがちだが実はそうではないよ
- ガベージコレクタが管理しているのは、GCルートから参照されているオブジェクトで、参照されていないオブジェクトをゴミとみなすということだよ。イメージされるゴミ集めの実装を反対にした感じ。
- OSでのグローバルな同期が必要ないから、個々のオブジェクトの作成は速いよ
- JVMが確保したヒープのメモリアレイのオフセット変えるだけだし、次のメモリ確保もオフセットをずらすだけでよいからね
- JVMは一旦確保したメモリを削除したもしないし、OSから確保したリソースをOSに返したりもしないよ
Garbage-Collection Roots—The Source of All Object Trees
- JVMにはGarbage-Collection Rootsというものがあるよ
- 普通のJavaアプリケーションは以下の3つの種類のGCルートがあるよ
- メインスレッドのローカル変数
- メインスレッド
- メインクラスのスタティック変数
- JNI参照も GCルートの一種としてあるんだけど、JVMはネイティブコードからJNI参照がどのように参照されているかわからないし、ちょっと特殊な形式のGCルートになっているんだよね
- 詳しくは、Problem Patterns セクションにあるよ
Marking and Sweeping Away Garbage
- JavaVMのガベージコレクションには、mark-and-sweep algorithm が使われているよ
- これはどういうアルゴリズムかというと、下記の通りだよ
- GCルートから参照されているオブジェクトを巡回して、マークしていく
- ヒープにマークされていないオブジェクトがあれば使われていないものとみなされるよ
感想
英語のドキュメントは割りと読む方ですが、読んだ知識をアウトプットしていなかったので、今回試しにやってみました。
他の人に読んでもらうためというよりも、自分の理解を深めるため・記憶として定着させるためという意図のほうが大きいため、あまり気取らない形で、今後も続けていきたいです。