JAVA_OPTIONS "と "JAVA_TOOL_OPTIONS "の比較ができたらいいなと思いました。 私も少し探してみましたが、見つからないので、このStackoverflowで知識を得られればと思います。
JAVA_OPTS
は念のために入れておきます。これはJVMの一部ではありませんが、世間ではこれに関する質問がたくさんあります。
今のところわかっていることは
java
と javac
で取り上げられます。_JAVA_OPTIONS
(他のものを上書きします)
2.コマンドラインパラメータJAVA_TOOL_OPTIONS
(他のもので上書きされます)と
_JAVA_OPTIONS` を比較した公式ドキュメントはありますか?と
_JAVA_OPTIONS` の間に何か他の違いはありますか (優先順位を除いて)。JAVA_TOOL_OPTIONS
と _JAVA_OPTIONS
を拾うのか(java
と javac
に加えて)。と
_JAVA_OPTIONS` に含めることができるものの制限JAVA_OPTIONSについてのドキュメントは見つかりませんでした。[JAVA_TOOL_OPTIONS
のドキュメント]2を見ても、その違いについてはあまり詳しく書かれていません。
JAVA_TOOL_OPTIONS]2は、次のように説明しています: > 埋め込み型のVMや、スクリプトの奥深くで起動した単純なVMなど、コマンドラインに常にアクセスしたり変更したりすることはできないので、このような場合にエージェントを起動できるように、JAVA_TOOL_OPTIONS変数が提供されます。
これは、私がこの問題を解決するために使用したコードです。コンソール出力はコメントとして含まれています。
export JAVA_OPTS=foobar
export JAVA_TOOL_OPTIONS=
export _JAVA_OPTIONS="-Xmx512m -Xms64m"
java -version
# Picked up JAVA_TOOL_OPTIONS:
# Picked up _JAVA_OPTIONS: -Xmx512m -Xms64m
# java version "1.7.0_40"
OpenJDK Runtime Environment (IcedTea 2.4.1) (suse-3.41.1-x86_64)
OpenJDK 64-Bit Server VM (build 24.0-b50, mixed mode)
javac -version
# Picked up JAVA_TOOL_OPTIONS:
# Picked up _JAVA_OPTIONS: -Xmx512m -Xms64m
# javac 1.7.0_40
export JAVA_TOOL_OPTIONS="-Xmx1 -Xms1"
export _JAVA_OPTIONS="-Xmx512m -Xms64m"
javac -version
# Picked up JAVA_TOOL_OPTIONS: -Xmx1 -Xms1
# Picked up _JAVA_OPTIONS: -Xmx512m -Xms64m
# javac 1.7.0_40
export JAVA_TOOL_OPTIONS="-Xmx512m -Xms64m"
export _JAVA_OPTIONS="-Xmx1 -Xms1"
javac -version
# Picked up JAVA_TOOL_OPTIONS: -Xmx512m -Xms64m
# Picked up _JAVA_OPTIONS: -Xmx1 -Xms1
# Error occurred during initialization of VM
# Too small initial heap
export JAVA_TOOL_OPTIONS="-Xmx1 -Xms1"
export _JAVA_OPTIONS=
java -Xmx512m -Xms64m -version
# Picked up JAVA_TOOL_OPTIONS: -Xmx1 -Xms1
# Picked up _JAVA_OPTIONS:
# java version "1.7.0_40"
# OpenJDK Runtime Environment (IcedTea 2.4.1) (suse-3.41.1-x86_64)
# OpenJDK 64-Bit Server VM (build 24.0-b50, mixed mode)
export JAVA_TOOL_OPTIONS=
export _JAVA_OPTIONS="-Xmx1 -Xms1"
java -Xmx512m -Xms64m -version
# Picked up JAVA_TOOL_OPTIONS:
# Picked up _JAVA_OPTIONS: -Xmx1 -Xms1
# Error occurred during initialization of VM
# Too small initial heap
これらのオプションは、ライブラリ呼び出しでJVMをインプロセスで起動した場合にもピックアップされることを除けば、ほぼ正解でした。
JAVA_OPTIONSが文書化されていないということは、この変数を使うことは推奨されていないということであり、実際にこの変数を
~/.bashrc`に設定して悪用している人を見たことがあります。しかし、この問題の真相を究明したいのであれば、Oracle HotSpot VMのソースを確認することができます(例:OpenJDK7の場合)。
また、他のVMが文書化されていない変数をサポートしている、あるいは今後もサポートするという保証はないことを覚えておいてください。
update 2015-08-04:検索エンジンから来た人のために5分を節約するために、_JAVA_OPTIONS
はコマンドライン引数よりも優先され、それはJAVA_TOOL_OPTIONS
よりも優先されます。
もう一つ違いがあります。JAVA_OPTIONS "はオラクル固有のものです。IBM JVMでは、代わりに「IBM_JAVA_OPTIONS」を使用しています。これはおそらく、マシン固有のオプションを衝突せずに定義できるようにするためです。JAVA_TOOL_OPTIONS` は、すべての VM で認識されます。
JAVA_OPTS`は、JVMでは全く特別な処理をしない1。
また、https://bugs.openjdk.java.net/browse/JDK-4971166 によると、JAVA_TOOL_OPTIONS
は標準的な JVMTI の仕様に含まれており、引用符で囲まれたスペースの扱いがより優れているため、文書化されていないホットスポット固有の _JAVA_OPTIONS
の代わりに常に優先されるべきだとしています。
また、これらを使用すると、print additional message to stdout that can't be suppressedとなるので注意が必要です。