Xmsオプションの詳細
オプション名 | オプションの機能詳細 |
---|---|
-Xms | Javaのメモリ割り当てプール(ヒープ・サイズ)の初期値を指定するオプションです 指定する値が1MB未満の場合、もしくは-XX:NewSizeオプションの値(デフォルト値を含む)以下の場合は初期化エラーが発生し、Javaプロセスが終了します |
例えば、メモリ割り当てプールの初期値を「128MB」として設定する場合、下記のように指定します。
-Xms128m
Xmsのメモリについて
ここでは、Xmsのメモリについて仕組みを解説します。
以下は、 JVM のヒープ・メモリ構造を示した画像です。
(引用元:Javaのヒープ・メモリ管理の仕組み)
ヒープ・メモリ内には、新しいオブジェクトを格納できるNEW領域と、古いオブジェクトを格納できるOLD領域があります。
作成されてすぐに必要のなくなるオブジェクトは、NEW領域に保管。
一方、長期間にわたって保持されるオブジェクトは、OLD領域に保管されます。
JVMのデフォルト設定の場合、NEW領域の起動時のサイズは2MB、最大サイズは16MBに設定されているのが特徴です。
また、OLD領域の起動時のサイズは4MB、最大サイズは48MBとなっています。
NEW領域とOLD領域のサイズは、JVMオプションを使用することで変更可能です。
そのうちのひとつが、Xmsオプションになります。
オプション名 | オプションの機能詳細 |
---|---|
-Xms | ヒープ・メモリ全体の起動時のサイズを変更 |
-Xmx | ヒープ・メモリ全体の最大サイズを変更 |
-Xmn | NEW領域のサイズを変更 |
-XX:SurvivorRatio= | Eden領域のサイズをFromまたはTo領域のサイズで割った値(FromとTo領域は同じサイズ) |
Xmsオプションの確認・設定方法
Xmsオプションのコマンド入力例は下記の通りです。
$ java -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xms512m -Xmx512m
この例でいくと、ヒープ・メモリ全体の起動時のサイズは512MBになります。
Javaプログラムでメモリ情報を確認
Javaプログラムでメモリ情報を確認するサンプルコードと実行方法です。
■記述例 public class MemoryCheck { public static void main(String[] args) { Runtime rt = Runtime.getRuntime(); System.out.println("バージョン : " + rt.version()); System.out.println("最大メモリ : " + rt.maxMemory()); System.out.println("合計メモリ : " + rt.totalMemory()); } }
■実行結果 mbp:desktop potepan$ java -Xms64m -Xmx256m MemoryCheck バージョン : 12.0.2+10 最大メモリ : 268435456 合計メモリ : 69206016
初期ヒープサイズを64MBに、最大ヒープサイズを256MBに指定した場合の実行結果です。
最大メモリが268MB程度、合計メモリが69MB程度になっているのがわかります。
■実行結果 mbp:desktop potepan$ java -Xms256m -Xmx256m MemoryCheck バージョン : 12.0.2+10 最大メモリ : 268435456 合計メモリ : 268435456
こちらは初期ヒープサイズも最大ヒープサイズを256MBに指定した場合の実行結果です。
どちらも最大メモリが268MB程度になりました。
■実行結果 mbp:desktop potepan$ java -XX:MaxRAM=256m MemoryCheck バージョン : 12.0.2+10 最大メモリ : 132120576 合計メモリ : 10485760
最後に、物理メモリサイズを256MBで指定した場合の実行結果です。
最大メモリが132MB、合計メモリが10MB程度になっていますね。
Eclipseでヒープ・ステータスを確認
Eclipseでヒープ・ステータス(メモリ量(Xms)・最大メモリ量(Xmx))を表示する手順は下記の通りです。
①Eclipseを起動し、設定アイコンをクリック
②設定画面の「一般」から「ヒープ・ステータスを表示」にチェックを入れ、「適用して閉じる」をクリック
③Eclipseの画面下部にヒープ・ステータスが表示されます
XmsとXmxは同じ?
XmsとXmxは異なるコマンドオプションです。
- -Xms:ヒープ・メモリ全体の起動時のサイズを変更します
- -Xmx:ヒープ・メモリ全体の最大サイズを変更します
XmsとXmxのデフォルトサイズは?
JVMのデフォルト設定の場合、NEW領域の起動時のサイズ(Xms)は2MB、最大サイズ(Xmx)は16MB。
OLD領域の起動時のサイズ(Xms)は4MB、最大サイズは48MB(Xmx)です。
ヒープとは?
ここでは少し、ヒープについて説明します。
ヒープとは、コンピュータプログラムが利用するメモリ領域の種類のひとつです。
プログラム実行時に、任意のタイミングで領域の確保・解放が可能なものをヒープ領域と言います。
プログラム実行時に、OS側からある一定のサイズのメモリ領域が、ヒープ領域用として割り当てられます。
その内、プログラム側が任意のタイミングで必要量を明示的に宣言し、データ・オブジェクトなどを保存するために領域を確保可能です。
スタック領域とは違い、使用用途や確保・解放のタイミングが定められていないため、プログラム側の都合で自由に使えます。
ヒープ領域が不要になれば、明示的に解放処理を実行することで保存したデータは破棄され、再度他の用途のために確保できるようになるのです。
javaコマンドオプションの確認・設定方法
ここでは、javaコマンドオプションの確認・設定方法を見ていきましょう。
標準オプション(-classpath、-version)
javaコマンドの中でも標準オプションは、下記コマンドで一覧を確認可能です。
$ java -help
実際に実行してみると、下記のように表示されます。
使用方法: java [options] [args...] (クラスを実行する場合) または java [options] -jar [args...] (jarファイルを実行する場合) または java [options] -m [/] [args...] java [options] --module [/] [args...] (モジュールのメイン・クラスを実行する場合) または java [options] [args] (単一のソースファイル・プログラムを実行する場合) メイン・クラス、ソース・ファイル、-jar 、 -mまたは--module /に続く引数は、メイン・クラスへの引数として 渡されます。 オプションは次のとおりです: -cp <ディレクトリおよびzip/jarファイルのクラス検索パス> -classpath <ディレクトリおよびzip/jarファイルのクラス検索パス> --class-path <ディレクトリおよびzip/jarファイルのクラス検索パス> :区切りリスト(ディレクトリ、JARアーカイブ、 ZIPアーカイブ)で、クラス・ファイルの検索用。 -p --module-path ... ディレクトリの:区切りリスト、各ディレクトリ はモジュールのディレクトリです。 --upgrade-module-path ... ディレクトリの:区切りリスト、各ディレクトリ は、ランタイム・イメージ内のアップグレード可能な モジュールを置換するモジュールのディレクトリです --add-modules [,...] 初期モジュールに加えて解決するルート・モジュール。 には次も指定できます: ALL-DEFAULT、ALL-SYSTEM、 ALL-MODULE-PATH. --list-modules 参照可能なモジュールをリストし終了します -d --describe-module モジュールを説明し終了します --dry-run VMを作成しメイン・クラスをロードしますが、メイン・メソッドは実行しません。 --dry-runオプションは、次の検証に役立つ場合があります: モジュール・システム構成などのコマンド行オプション。 --validate-modules すべてのモジュールを検証し終了します --validate-modulesオプションは、次の検索に役立つ場合があります: モジュール・パス上のモジュールでの競合およびその他のエラー。 -D= システム・プロパティを設定します -verbose:[class|module|gc|jni] 詳細出力を有効にします -version 製品バージョンをエラー・ストリームに出力して終了します --version 製品バージョンを出力ストリームに出力して終了します -showversion 製品バージョンをエラー・ストリームに出力して続行します --show-version 製品バージョンを出力ストリームに出力して続行します --show-module-resolution 起動時にモジュール解決出力を表示します -? -h -help このヘルプ・メッセージをエラー・ストリームに出力します --help このヘルプ・メッセージを出力ストリームに出力します -X 追加オプションのヘルプをエラー・ストリームに出力します --help-extra 追加オプションのヘルプを出力ストリームに出力します -ea[:...|:] -enableassertions[:...|:] 指定した粒度でアサーションを有効にします -da[:...|:] -disableassertions[:...|:] 指定した粒度でアサーションを無効にします -esa | -enablesystemassertions システム・アサーションを有効にします -dsa | -disablesystemassertions システム・アサーションを無効にします -agentlib:[=] ネイティブ・エージェント・ライブラリをロードします。例: -agentlib:jdwp -agentlib:jdwp=helpも参照してください -agentpath:[=] フルパス名を使用して、ネイティブ・エージェント・ライブラリをロードします -javaagent:[=] Javaプログラミング言語エージェントをロードします。java.lang.instrumentを参照してください -splash: 指定されたイメージを含むスプラッシュ画面を表示します HiDPIスケールのイメージが自動的にサポートされて使用されます (可能な場合)。スケーリングされないイメージのファイル名(image.extなど)を 引数として-splashオプションに必ず渡す必要があります。 指定された最も適切なスケーリング済イメージが選択されます (自動的)。 詳細は、SplashScreen APIのドキュメントを参照してください @argumentファイル オプションを含む1つ以上の引数ファイル -disable-@files さらなる引数ファイル拡張を無効にします --enable-preview クラスをこのリリースのプレビュー機能に依存させることができます 長いオプションの引数を指定する場合、--=または -- を使用できます。
かなり多くのコマンドがあるので、必要なコマンドを探すのは少し苦労します。
標準オプションでよく使うものには「version」があります。
$ java -version
実行すると、下記のようにJavaのバージョンが表示されます。
mbp:desktop potepan$ java -version java version "12.0.2" 2019-07-16 Java(TM) SE Runtime Environment (build 12.0.2+10) Java HotSpot(TM) 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)
非標準オプション(-Xmx、-Xms)
javaコマンドの中でも非標準オプションは、下記コマンドで一覧を確認可能です。
$ java -X
今回紹介した「Xms」もこちらの非標準オプションのひとつですね。
実際に実行してみると、下記のように表示されます。
-Xbatch バックグラウンドのコンパイルを無効にする -Xbootclasspath/a:<:で区切られたディレクトリおよびzip/jarファイル> ブートストラップ・クラス・パスの最後に追加する -Xcheck:jni JNI関数に対する追加のチェックを実行する -Xcomp 初回呼出し時にメソッドのコンパイルを強制する -Xdebug 下位互換性のために提供 -Xdiag 追加の診断メッセージを表示する -Xfuture 将来のデフォルトを見越して、最も厳密なチェックを有効にする -Xint インタプリタ・モードの実行のみ -Xinternalversion -versionオプションより詳細なJVMバージョン情報を 表示する -Xloggc: タイムスタンプが付いたファイルにGCステータスのログを記録する -Xmixed 混合モードの実行(デフォルト) -Xmn 若い世代(ナーサリ)のヒープの初期および最大サイズ(バイト単位) を設定する -Xms Javaの初期ヒープ・サイズを設定する -Xmx Javaの最大ヒープ・サイズを設定する -Xnoclassgc クラスのガベージ・コレクションを無効にする -Xrs Java/VMによるOSシグナルの使用を削減する(ドキュメントを参照) -Xshare:auto 可能であれば共有クラスのデータを使用する(デフォルト) -Xshare:off 共有クラスのデータを使用しようとしない -Xshare:on 共有クラス・データの使用を必須にし、できなければ失敗する。 -XshowSettings すべての設定を表示して続行する -XshowSettings:all すべての設定を表示して続行する -XshowSettings:locale すべてのロケール関連の設定を表示して続行する -XshowSettings:properties すべてのプロパティ設定を表示して続行する -XshowSettings:vm すべてのVM関連の設定を表示して続行する -XshowSettings:system (Linuxのみ) ホスト・システムまたはコンテナの 構成を表示して続行する -Xss Javaのスレッド・スタック・サイズを設定する -Xverify バイトコード検証機能のモードを設定する --add-reads =(,)* モジュール宣言に関係なく、を更新して を読み取る。 をALL-UNNAMEDに設定すると、すべての名前のないモジュールを 読み取れます。 --add-exports /=(,)* モジュール宣言に関係なく、を更新してをに エクスポートする。 をALL-UNNAMEDに設定すると、すべての名前のないモジュールに エクスポートできます。 --add-opens /=(,)* モジュール宣言に関係なく、を更新して をに開く。 --illegal-access= 名前のないモジュール内のコードによる、名前のあるモジュール内の タイプのメンバーへのアクセスを許可または拒否する。 は"deny"、"permit"、"warn"、"debug"のいずれかです このオプションは将来のリリースで削除されます。 --limit-modules [,...] 参照可能なモジュールの領域を制限する --patch-module =(:)* JARファイルまたはディレクトリのクラスおよびリソースで モジュールをオーバーライドまたは拡張する。 --disable-@files さらなるファイル拡張を無効にする --source ソースファイル・モードでソースのバージョンを設定する。 これらは追加オプションであり予告なしに変更されることがあります。 次のオプションはMac OS X固有です: -XstartOnFirstThread main()メソッドを最初(AppKit)のスレッドで実行する -Xdock:name= Dockに表示されるデフォルト・アプリケーション名をオーバーライドする -Xdock:icon= Dockに表示されるデフォルト・アイコンをオーバーライドする
Mac OS X固有のオプションもあります。
そもそも、ヒープは「山積み」という言葉の「山」を意味する英単語です。