メモリ管理
目次
概要
プログラムで使用するデータやコードは種類に応じて以下の領域に分けて保存される。
Permanent領域
クラス情報
ロードしたハードディスク等のクラスファイルが保存される。
JAVA等ではメタデータに変換される。
staticメンバー
クラスのデータの内、staticで宣言された変数はここに保存される。
インスタンス変数はインスタンス毎に値が異なるが、
static変数はクラスに付き共用で1つ。
スタック領域
ローカル変数
メソッド内で宣言される変数はここに保存される。
メソッドの処理が終了すると別のメソッドに上書きされる。
メソッド呼び出し時の戻りアドレス
メソッドから別のメソッドを呼び出す際に戻り先のアドレスをここに保存しておく。
メソッドの処理が終了すると別のデータに上書きされる。
ヒープ領域
インスタンス
インスタンスを作成する毎にここに保存される。
参照が終了するとガベージコレクタの消去の対象となる。
動的メモリ割り当て
クラス、配列、可変長文字列型等、
使用するメモリサイズが事前に分からない場合のメモリ領域の確保方式。
ヒープ領域に大きめのサイズを確保して割り当てる。
変数の使用が終わった場合に自分で解放処理を行う必要がある。
解放しない場合、プロセスが終了するまでその領域を使用する事はできず、
コンピューター全体の使用可能なメモリ領域が徐々に減少し、最終的にシステムダウンする(=メモリリーク)。
「^」:ヒープ領域に保存する(C++)
System::String^ msg;
アップキャスト時の動作
ダウンキャスト時の動作
ヒープ領域内のオブジェクト移動(Java)
From、To領域を合わせてSurvivor(生存者)領域と呼ぶ
(1)Eden領域
インスタンスはEden領域に作成される
(2)From領域
Eden領域が一杯になるとScavengeGCにより、From領域に移動される
(3)To領域
From領域が一杯になるとScavengeGCにより、再度From領域に移動される
(4)Old領域
From~To領域の移動が規定回数を超えるとScavengeGCにより、Old領域に移動される
規定回数:MaxTenuringThreshold値(デフォルト:32回)
ScavengeGCの処理回数が増える程、プログラムの動作は遅くなる
ScavengeGCの処理回数を減らすには実行時のチューニングが必要
パラメータ | 意味 | 規定値 | 最大値 |
---|---|---|---|
-Xms | ヒープ全体初期値 | 6656k | |
-Xmx | ヒープ全体最大値 | ||
-XX:NewSize | New領域初期値 | calculated | |
-XX:MaxNewSize | New領域最大値 | ||
-XX:PermSize | Permanent領域初期値 | ||
-XX:MaxPermSize | Permanent領域最大値 | ||
-XX:NewRatio | New領域とOld領域の比率 | 2 | |
-XX:SurvivorRatio | New領域とSurvivor領域の比率 | 8 |
例
java ~
-Xms2048m
-Xmx2048m
-XX:NewSize=128m
-XX:MaxNewSize=128m
-XX:PermSize=64m
-XX:MaxPermSize=64m
-XX:NewRatio=2
-XX:SurvivorRatio=8