Xmxオプションとは?
オプション名 | オプションの機能詳細 |
---|---|
-Xmx | 拡張領域のサイズも含む、Javaヒープの最大サイズ(ヒープ・さいず)を指定するオプションです |
サイズはメガバイト (m) またはギガバイト (g) で指定できます。
例えば、下記のように指定すると、最大ヒープ・サイズが 256MB に設定されます。
-Xmx256m
Xmxオプションの確認・設定方法
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
こちらは、初期ヒープサイズ(Xms)も最大ヒープサイズ(Xmx)も、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の画面下部にヒープ・ステータスが表示されます
XmxとXmsの違い
XmsとXmxの違いは下記の通りです。
- -Xmx:ヒープ・メモリ全体の最大サイズを変更します
- -Xms:ヒープ・メモリ全体の起動時のサイズを変更します
Xmxがヒープ・メモリ全体の最大サイズに対し、Xmsは起動時のサイズになります。
それぞれ異なるものですので覚えておきましょう。
そもそもヒープとは?
ヒープとは、コンピュータプログラムが利用できるメモリ領域のひとつの種類です。
スタック領域とは異なり、使い道や確保・解放のタイミングが決まっていないので、プログラム側が自由に使用可能です。
OS側から一定のサイズのメモリ領域を、プログラム実行時にヒープ領域のために割り当てられます。
その中から、プログラム側が任意のタイミングで必要な量を宣言し、データやオブジェクトなどを保存するために、ヒープ領域を確保できるのです。
また、ヒープ領域が不要になれば、明示的に解放処理を実行できます。
そうすることで、保存したデータは破棄され、他の用途のために確保できるようになります。
Xmxのデフォルト設定について
最大 Java ヒープ・サイズ(Xmx)のデフォルトは、下記の通りです。
- AIX®:使用可能メモリーの半分のサイズ (最小 16 MB、最大 512 MB)
- IBM® i:2GB
- Linux:使用可能メモリーの半分のサイズ (最小 16 MB、最大 512 MB)
- Windows:使用可能メモリーの半分のサイズ (最小 16 MB、最大 512 MB)
- z/OS®:使用可能メモリーの半分のサイズ (最小 16 MB、最大 512 MB)
(引用:JVM のデフォルト設定)
Xmxの物理メモリについて
javaコマンドのツール・リファレンスによると、Xmxの物理メモリは下記の通りです。
-Xmx size
メモリー割当てプールの最大サイズ(バイト単位)を指定します。この値は、1024の倍数で、2Mバイトより大きくなければなりません。キロバイトを指定するには文字kまたはK、メガバイトを指定するには文字mまたはM、ギガバイトを指定するには文字gまたはGを付けます。デフォルト値は、実行時にシステムの設定に基づいて選択されます。サーバー配備の場合、-Xmsと-Xmxが同一の値に設定されていることがよくあります。次の例では、様々な単位を使用して、割り当てられたメモリーの最大許容サイズを80Mバイトに設定する方法を示します。-Xmx83886080
-Xmx81920k
-Xmx80m
-Xmxオプションは-XX:MaxHeapSizeと同等です。
デフォルトの場合、「-Xmx」の最大値は物理メモリの1/4となっています。
JavaのXmxサイズを超えることがある?
結論を言うと、Xmxサイズを超えることはあり得ます。
JVMが利用するメモリには、次の3種類があります。
- Javaヒープ
- Cヒープ(Nativeヒープ)
- スレッドスタック
一般的に言われているヒープはJavaヒープを指し、「-Xmx」や「-Xms」はJavaヒープサイズの制限を指定しています。
一方、JVMはJavaヒープ以外にも「Cヒープ」「スレッドスタック」を使用していますので、JVMプロセスのメモリ使用量は実際には3種類の合算値です。
つまり、Javaヒープ使用量が「-Xmx」で指定した最大サイズになれば、JVMプロセスのメモリ使用量は「-Xmx」で指定した最大サイズを超えることになります。
その他のjavaコマンドオプション
ここでは、javaコマンドオプションの確認・設定方法を紹介します。
標準オプション
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
今回紹介した「Xmx」もこちらの非標準オプションのひとつですね。
実際に実行してみると、下記のように表示されます。
-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に表示されるデフォルト・アイコンをオーバーライドする
さらに、プログラム実行時に好きなタイミングで領域の確保・解放ができるものを「ヒープ領域」と言います。