Javaメモリ管理¶
はじめに¶
Javaはガベージコレクションがあるので自動で不要なデータをメモリから削除してくれるからプログラミングするときはメモリ管理なんて気にしないでいいよと思うかもしれません。しかし、ガベージコレクションが適切に不要なデータを削除してもらうには、インスタンスを生成したらその参照を適切に保持し、不要になれば参照を適切に外すようプログラミングしなければなりません。でないとJavaのメモリ(ヒープ)にインスタンスがどんどん増えていくいわゆるメモリリークが生じます。
オブジェクトのメモリ¶
オブジェクトヘッダー¶
64bit版Hotspot VMのオブジェクトヘッダー¶
参考資料:OpenJDK Project Lilliput
https://wiki.openjdk.org/display/lilliput/Main
128bitで構成し、最初の64bitが lock または mark ワードで、続く64bitがクラスポインターです。
Lock word |
Class pointer |
Lock wordは、状況により次のいずれかの情報を持ちます。
- ロックされている時[下位2bitが00]、上位62bitはスタック上に保存される真のヘッダー情報を指すポインターとなる
- ロックされていない時[下位3bitが001]、上位61bitは本来のオブジェクトヘッダーとなる
- Monitor状態[下位2bitが10] 上位62bitは真のヘッダー情報を指すポインターとなる
- Inflating in progress[すべてのbitが0]
- Forwarded[下位2bitが11]、GC用で上位62bitは転送されたオブジェクトを指
- 下位3bitが001のとき、下位4-7bitがGCのための年齢(age)を示す
- ハッシュコード:System.identifyHashCode()が呼ばれるとオブジェクトのハッシュを計算し31bitの領域に格納する
T.B.D.
1234567890 10 spaces