メモリ管理

概要

プログラムで使用するデータやコードは種類に応じて以下の領域に分けて保存される。
memory_management

Permanent領域

クラス情報

ロードしたハードディスク等のクラスファイルが保存される。
JAVA等ではメタデータに変換される。

staticメンバー

クラスのデータの内、staticで宣言された変数はここに保存される。
インスタンス変数はインスタンス毎に値が異なるが、
static変数はクラスに付き共用で1つ。

スタック領域

ローカル変数

メソッド内で宣言される変数はここに保存される。
メソッドの処理が終了すると別のメソッドに上書きされる。

メソッド呼び出し時の戻りアドレス

メソッドから別のメソッドを呼び出す際に戻り先のアドレスをここに保存しておく。
メソッドの処理が終了すると別のデータに上書きされる。

ヒープ領域

インスタンス

インスタンスを作成する毎にここに保存される。
参照が終了するとガベージコレクタの消去の対象となる。
動的メモリ割り当て
クラス、配列、可変長文字列型等、
使用するメモリサイズが事前に分からない場合のメモリ領域の確保方式。
ヒープ領域に大きめのサイズを確保して割り当てる。
変数の使用が終わった場合に自分で解放処理を行う必要がある。
解放しない場合、プロセスが終了するまでその領域を使用する事はできず、
コンピューター全体の使用可能なメモリ領域が徐々に減少し、最終的にシステムダウンする(=メモリリーク)。
「^」:ヒープ領域に保存する(C++)
System::String^ msg;

アップキャスト時の動作

memory_upcast

ダウンキャスト時の動作

memory_downcast

ヒープ領域内のオブジェクト移動(Java)

memory_downcast
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