web-dev-qa-db-ja.com

_Java_OPTIONS Java_TOOL_OPTIONSとJava_OPTSの違い

_Java_OPTIONSJava_TOOL_OPTIONSを比較するのは素晴らしいことだと思いました。私は1つを少し探していましたが、何も見つかりませんので、ここでStackoverflowに関する知識を見つけることができると思います。

Java_OPTSは完全を期すために含まれています。 JVMの一部ではありませんが、実際には多くの質問があります。

私が知っていること:

これまでのところ、私はそれを発見しました:

  • Java_OPTSはJDKではなく、他の多くのアプリで使用されます( この投稿 を参照)。
  • Java_TOOL_OPTIONSおよび_Java_OPTIONSは、代わりに環境変数としてJVM引数を指定する方法ですコマンドラインパラメータの。
    • 少なくともJavajavacによってピックアップされます
    • これらの優先順位は次のとおりです。
      1. _Java_OPTIONS(その他を上書きします)
      2. コマンドラインパラメーター
      3. Java_TOOL_OPTIONS(他のユーザーによって上書きされます)

私が知りたいこと

  • Java_TOOL_OPTIONS_Java_OPTIONSを比較する公式ドキュメントはありますか
  • Java_TOOL_OPTIONS_Java_OPTIONSの間に他の違いはありますか(優先順位を除く)。
  • どの実行可能ファイルがJava_TOOL_OPTIONSおよび_Java_OPTIONSを取得するか(Javaおよびjavacに加えて)
  • Java_TOOL_OPTIONSおよび_Java_OPTIONSに含めることができるものに関する制限

公式文書

_Java_OPTIONSに関するドキュメントを見つけることができませんでした。 Java_TOOL_OPTIONSのドキュメント は、違いをあまり明らかにしていません。

コマンドラインは常にアクセスまたは変更できるとは限らないので、たとえば組み込み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
112
Tobber

ライブラリ呼び出しを介してインプロセスでJVMを起動した場合でも、これらのオプションが選択されることを除いて、あなたはほとんどそれを打ち込んでいます。

_Java_OPTIONSが文書化されていないという事実は、この変数を使用することは推奨されないことを示唆しており、実際に~/.bashrcに設定することで人々がそれを悪用しているのを見てきました。ただし、この問題の一番下に到達したい場合は、Oracle HotSpot VMのソースを確認できます(例 OpenJDK7 )。

また、他のVMがドキュメント化されていない変数をサポートしている、またはサポートし続ける保証がないことも忘れないでください。

更新2015-08-04:検索エンジンから来た人のために5分節約するために、_Java_OPTIONSはコマンドライン引数よりも優先され、コマンドライン引数はJava_TOOL_OPTIONSよりも優先されます。

49
mkalkov

もう1つ違いがあります。_Java_OPTIONSはOracle固有です。 IBM JVMは、代わりにIBM_Java_OPTIONSを使用しています。これはおそらく、衝突することなくマシン固有のオプションを定義できるようにするために行われました。 Java_TOOL_OPTIONSはすべてのVMで認識されます。

27
Victor Havin

Java_OPTS have 特別な処理なし JVMではまったく。

https://bugs.openjdk.Java.net/browse/JDK-4971166 によれば、Java_TOOL_OPTIONSは標準のJVMTI仕様に含まれており、引用符で囲まれたスペースの処理を改善し、常に文書化されていないホットスポット固有の_Java_OPTIONSの代わりに推奨されます。

また、これらを使用することに注意してください 抑制できない追加メッセージをstdoutに出力します

14
Vadzim