Slideshow transcript
Slide 1: メモリ勉強会 開発本部 吉田 哲也 2007/07/23
Slide 2: Java 仮想マシン仕様より • Java 仮想マシン・スタック • ヒープ • メソッド・エリア • 実行時コンスタント・プール • ネイティブ・メソッド・スタック
Slide 3: メモリモデルの概要 Java プロセスのメモリ領域 ヒープ領域 Java メソッド ネイティブ 仮想マシン エリア メソッド インスタンス スタック スタック スレッド 1 用 クラス C 言語 スレッド 1 クラス スレッド 2 用 インスタンス スレッド 2 “abc” “def” スレッド 3 用 スレッド 3 -Xmx -Xss -XX:MaxPermSize
Slide 4: Java 仮想マシン・スタック • 他のプログラミング言語におけるスタック • フレームが格納される • フレームは下記を格納するためのもの – ローカル変数 – 中間的なデータ – メソッドの起動 – メソッドの戻り値 – 例外のディスパッチ • 各スレッド毎に生成され、スレッド終了時に破棄される • 固定でも動的に拡張・縮小してもよい • ヒープ上に割り当てることも可能 – Sun JRE ではヒープ上には割り当てられていない??
Slide 5: Java 仮想マシン・スタック • 最大サイズ・最小サイズをユーザに指定させても良い – サイズ : -Xss ( 例 : -Xss1024) ※ 大きすぎる値 (2MB 以上 ) を指定するとパフォーマンスが 大幅に遅くなる可能性あり ※ BEA Web サイトより – デフォルト : 512KB (1.4 以前で 1.5 は要調査 ) • -server と -client によっても若干異なる • 許容量を超える Java 仮想マシン・スタックが要求さ れた場合には StackOverflowError がスローされる • Java 仮想マシン・スタック拡張時にメモリが確保でき なかった場合には OutOfMemoryError がスローされる
Slide 6: 質問 : スタック public static void main(String[] args) { StackOverFlowTest test = new StackOverFlowTest(); test.execute(); } private void execute() { execute(); }
Slide 7: ヒープ • 全てのインスタンスや配列が格納される • スレッドで共有される • 自動記憶管理システム (GC) によって回収される – 明示的にインスタンスが回収されることはない • 自動記憶管理システム (GC) アルゴリズムは Java 仮想マシン仕様では特 定しない – Java 仮想マシン実装者が選択可能 • 固定でも動的に拡張・縮小してもよい • 最大サイズ・最小サイズをユーザに指定させても良い – 最大 : -Xmx ( 例 : -Xmx1024m) – 最小 : -Xms ( 例 : -Xms1024m) – デフォルト (Sun JRE 1.5.x): • 最小 : マシンの物理メモリの 1/64 か、妥当な最小サイズかの大きい方。 簡単にテス トしたところ 7MB くらいでした。 • 最大 : 物理メモリの 1/4 か、 1GB かの小さい方。 • 自動記憶管理システムが確保できるよりも大きなヒープが必要になった場 合には OutOfMemoryError がスローされる
Slide 8: メソッド・エリア • 下記のものを格納する領域 – 実行コンスタント・プール – クラス毎の構造 • フィールド • メソッド • コンストラクタ • 別名パーマネント領域とも言う • スレッドから共有される • 論理的にはヒープの一部 – Sun の JRE ではヒープの一部となっていないようです – -Xmx を大きくすると – XX:MaxPermSize が取れません • 固定でも動的に拡張・縮小してもよい • 最大サイズ・最小サイズをユーザに指定させても良い – 最大 : -XX:MaxPermSIze ( 例 : -XX:MaxPermSize=128m) – 最小 : -XX:PermSize ( 例 : -XX:PermSize=128m) – デフォルト (Sun JRE): • 最大 : 64MB • 最小 : 1MB
Slide 9: 質問 : クラスが GC の対象となるため には? • ユーザ定義クラスローダによりロードさ れたクラス • ユーザ定義クラスローダへの参照がなく なった
Slide 10: 実行コンスタント・プール • クラス毎、インタフェース毎に存在 • コンパイル時に決定される定数 – 数値リテラル – 文字列リテラル • “aaa” のようにコンパイル時に決定される文字列 • 実行時に解決しなければならないメソッドやフィールド の参照 – クラスの構造体のようなもの • メソッド・エリアから割り当てられる • 実行時コンスタント・プールの構築に必要なメモリ容量 がメソッド・エリアで利用可能なメモリ容量よりも大き い場合には OutOfMemoryError がスローされる
Slide 11: 質問 : 文字列リテラル • “abc” == new String(“abc”) → false • StringBuilder buf = new StringBuilder(); buf.append(“abc”); “abc” == buf.toString() → false • “abc” == new String(“abc”).intern() → true • StringBuilder buf = new StringBuilder(); buf.append(“abc”); “abc” == buf.toString().intern() → true
Slide 12: 文字列リテラル • 文字列リテラル – String str = “a”; • 文字列リテラルではない – new String(“aaa”); – Stream から呼んできたデータを文字列化 – StringBuffer および StringBuilder から生成した文字 列 • String#intern() メソッドは、実行コンスタント ・プールにあるかどうかをチェックし、あれば 実行コンスタント・プールにある文字列の参照 を返し、なければ実行コンスタント・プールに プールして、その参照を返す。
Slide 13: ネイティブ・メソッド・スタッ ク • native メソッドの実行を行うためのスタック • 一般的にはスレッド毎に割り当てられる • 固定でも動的に拡張・縮小してもよい • 許容量を超えるネイティブ・メソッド・スタッ ククが要求された場合には StackOverflowError がスローされる • ネイティブ・メソッド・スタック拡張時にメモ リが確保できなかった場合、新規スレッド用の ネイティブ・メソッド・スタックが生成できな かった場合には OutOfMemoryError がスロー される
Slide 14: 質問 : メモリモデルの概要 Java プロセスのメモリ領域 ヒープ領域 Java メソッド ネイティブ 仮想マシン エリア メソッド インスタンス スタック スタック スレッド 1 用 クラス C 言語 スレッド 1 クラス スレッド 2 用 インスタンス スレッド 2 “abc” “def” スレッド 3 用 スレッド 3 Windows 32bit の場合の最大メモリ容量は? → 2GB です
Slide 15: jvmstat • http://java.sun.com/performance/jvmstat/ • Windows で使用する場合には若干の変更 が必要 • 変更方法は SNS に書いています。



Add a comment on Slide 1
If you have a SlideShare account, login to comment; else you can comment as a guest- Favorites & Groups
Showing 1-50 of 1 (more)