Javaの開発において、普段は気にすることのないJVMですが、実はさまざまなオプションが存在します。
この記事では、
- JVMのargumentsとは?
 - javaコマンドのオプション設定について
 - javaコマンドオプションの確認と設定方法
 
などの基本的な内容から、具体的な使い方に関しても解説していきます。今回はjavaコマンドのオプション設定について、わかりやすく解説します!
JVMのargumentsとは?
まずJVMについてですが、JVMとは「Java Virtual Machine」の略で、Javaのプログラムを動かすために必要なソフトウェアです。
Javaは一度プログラムを書けば、Windows、MacそしてLinuxどのマシンでもJavaが動くことを思想として作られています。そのため、JVMのような中間コードをプラットフォーム別に、命令文を変換する仮想マシンが実装されました。JVMは「Java仮想マシン」「JavaVM」とも言われています。
次にargumentsについてですが、argumentsとはjavaをコマンドラインで実行する際に指定する引数のことです。引数を指定してオプションの設定を行います。さまざまなアプリケーションやゲームはJavaで作られてることが多く、JVM上で動作しています。
とくに高スペックを要するゲームなどは、マシンのスペックによっては動作が重くなったり、もたついたりすることがあります。そんなとき、JVMのargumentsの設定で、メモリなどのヒープ領域を増やしてあげる必要があります。マインクラフトのようなゲームでも設定することができます。
なお、JVMについては以下の記事で詳しく解説しています!
            
                
                    
javaコマンドのオプション設定について
javaコマンドでは、引数でオプションを設定することで、メモリ量などを設定することができます。しかし、javaコマンドのオプションはさまざまな設定をすることが可能で、何をしたらいいか悩んでしまうことも・・・。
そこで、次項でjavaコマンドのさまざまなオプションや設定方法について説明します。
javaコマンドオプションの確認と設定方法
ここでは、ターミナルのコマンドで、javaコマンドのオプションを確認する方法を説明します。
標準オプション一覧(-cp、-version)
javaコマンドの標準オプションは、以下のコマンドで一覧を確認することができます。
$ java -help
コマンドを実行すると、以下のように表示されます。
使用方法: java [-options] class [args...]
           (クラスを実行する場合)
   または  java [-options] -jar jarfile [args...]
           (jarファイルを実行する場合)
optionsには次のものがあります。
    -d32      使用可能な場合は32ビットのデータ・モデルを使用する
    -d64      使用可能な場合は64ビットのデータ・モデルを使用する
    -server      "server" VMを選択する場合
    -zero      "zero" VMを選択する場合
    -jamvm      "jamvm" VMを選択する場合
    -dcevm      "dcevm" VMを選択する場合
                  デフォルトVMはserverです,
                  これはサーバークラスのマシンで実行しているためです。
    -cp <ディレクトリおよびzip/jarファイルのクラス検索パス>
    -classpath <ディレクトリおよびzip/jarファイルのクラス検索パス>
                  クラス・ファイルを検索するディレクトリ、
                  JARアーカイブおよびZIPアーカイブの:で区切られたリストです。
    -D<name>=<value>
                  システム・プロパティを設定する
    -verbose:[class|gc|jni]
                  詳細な出力を行う
    -version      製品バージョンを出力して終了する
    -version:<value>
                  警告: この機能は非推奨であり、詳細のリリースで
                  廃止されます。
                  指定したバージョンを実行に必須にする
    -showversion  製品バージョンを出力して続行する
    -jre-restrict-search | -no-jre-restrict-search
                  警告: この機能は非推奨であり、詳細のリリースで
                  廃止されます。
                  ユーザーのプライベートJREをバージョン検索に含める/除外する
    -? -help      このヘルプ・メッセージを出力する
    -X            非標準オプションに関するヘルプを出力する
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  指定した粒度でアサーションを有効にする
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  指定した粒度でアサーションを無効にする
    -esa | -enablesystemassertions
                  システム・アサーションを有効にする
    -dsa | -disablesystemassertions
                  システム・アサーションを無効にする
    -agentlib:<libname>[=<options>]
                  ネイティブ・エージェント・ライブラリ<libname>をロードする。例: -agentlib:hprof
                  -agentlib:jdwp=helpと-agentlib:hprof=helpも参照
    -agentpath:<pathname>[=<options>]
                  フルパス名でネイティブ・エージェント・ライブラリをロードする
    -javaagent:<jarpath>[=<options>]
                  Javaプログラミング言語エージェントをロードする。java.lang.instrumentを参照
    -splash:<imagepath>
                  指定したイメージでスプラッシュ画面を表示する
詳細はhttp://www.oracle.com/technetwork/java/javase/documentation/index.htmlを参照してください。
例えば、製品バージョンを調べたいときは「-version」を指定します。
$ java -version
実行すると、以下のような製品情報が表示されます。
java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
また「-cp」「-classpath」を指定すると、クラスファイルがカレントディレクトリにない場合に場所を指定することができます。
$ java -cp クラスファイルのディレクトリパス クラスファイル名
非標準オプション一覧(-Xmxでのメモリ設定)
javaコマンドの非標準オプションは、以下のコマンドで一覧を確認することができます。
$ java -X
    -Xmixed           混合モードの実行(デフォルト)
    -Xint             インタプリタ・モードの実行のみ
    -Xbootclasspath:<:で区切られたディレクトリおよびzip/jarファイル>
                      ブートストラップのクラスとリソースの検索パスを設定する
    -Xbootclasspath/a:<:で区切られたディレクトリおよびzip/jarファイル>
                      ブートストラップ・クラス・パスの最後に追加する
    -Xbootclasspath/p:<:で区切られたディレクトリおよびzip/jarファイル>
                      ブートストラップ・クラス・パスの前に付加する
    -Xdiag            追加の診断メッセージを表示する
    -Xnoclassgc       クラスのガベージ・コレクションを無効にする
    -Xincgc           増分ガベージ・コレクションを有効にする
    -Xloggc:<file>    タイムスタンプが付いたファイルにGCステータスのログを記録する
    -Xbatch           バックグラウンドのコンパイルを無効にする
    -Xms<size>        Javaの初期ヒープ・サイズを設定する
    -Xmx<size>        Javaの最大ヒープ・サイズを設定する
    -Xss<size>        Javaのスレッド・スタック・サイズを設定する
    -Xprof            CPUプロファイル・データを出力する
    -Xfuture          将来のデフォルトを見越して、最も厳密なチェックを有効にする
    -Xrs              Java/VMによるOSシグナルの使用を削減する(ドキュメントを参照)
    -Xcheck:jni       JNI関数に対する追加のチェックを実行する
    -Xshare:off       共有クラスのデータを使用しようとしない
    -Xshare:auto      可能であれば共有クラスのデータを使用する(デフォルト)
    -Xshare:on        共有クラス・データの使用を必須にし、できなければ失敗する。
    -XshowSettings    すべての設定を表示して続行する
    -XshowSettings:all
                      すべての設定を表示して続行する
    -XshowSettings:vm すべてのVM関連の設定を表示して続行する
    -XshowSettings:properties
                      すべてのプロパティ設定を表示して続行する
    -XshowSettings:locale
                      すべてのロケール関連の設定を表示して続行する
-Xオプションは非標準なので、予告なく変更される場合があります。
基本的に「-X」がついているオプションは非標準オプションとなります。
オプションの使用例として、JVMのメモリサイズを増やしたい場合は「-Xms<size> 」「-Xmx<size> 」などのオプションを指定します。
| オプション | 規定値(バイト) | 説明 | 
|---|---|---|
| -Xms | 2M | ヒープ領域の初期サイズ 1Mバイトより大きい1024の倍数  | 
| -Xmx | 64M | ヒープ領域の最大サイズ 2Mバイトより大きい1024の倍数  | 
| -XX:MetaspaceSize | 21M | メタスペースの初期サイズ 256Kバイトより大きい2のn乗  | 
| -XX:MaxMetaspaceSize | 無制限 | メタスペースの最大サイズ 256Kバイトより大きい2のn乗  | 
キロバイトを指定するには、文字kまたはKを追加します。メガバイトを指定するには、文字mまたはMを追加します。ギガバイトを指定するには、文字gまたはGを追加します。
以下に割り当てるメモリのヒープ領域を1024M~3072M、メタスペース(パーマネント領域)を128M~256Mに設定するときの例を記述します。
$ java -Xms1024M -Xmx3072M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M
例えば、マインクラフトというゲームのランチャーではjavaコマンドの引数を上記のように指定すれば、メモリを割り当てることができます。
javaコマンドのオプション一覧を確認する
javaコマンドにはさまざまなオプションが存在し、コンパイルのオプションやメモリサイズ、ガベージコレクションの有効有無など、さまざまな設定をすることが可能です。
以下のORACLEの公式サイトで、JVMで使用できる全てのオプションを確認することができます。
ORACLEの公式サイト
・Standard Options
・Non-Standard Options
・Advanced Runtime Options
・Advanced JIT Compiler Options
・Advanced Serviceability Options
・Advanced Garbage Collection Options
JVMについてもっと詳しく知りたい方へ
JVMの概要やインストール、設定方法については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
            
                
                    
まとめ
ここでは、Javaにおけるjavaコマンドのオプションの確認や設定方法について説明しました。
Javaのプログラムを動かす上で、javaコマンドのオプションを設定できるようになれば、マシンのスペックやシステムに合わせて、Javaを最適な環境で動かすことができます。
もし、javaコマンドのオプションについて忘れてしまったら、この記事を思い出してくださいね!
  





