_JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違い


151

私は間の比較持っているのは素晴らしいことだろうと思った_JAVA_OPTIONSとしますJAVA_TOOL_OPTIONS。私は少し探していましたが、何も見つかりません。Stackoverflowで知識を見つけられることを願っています。

JAVA_OPTS完全性のために含まれています。これはJVMの一部ではありませんが、実際には多くの疑問があります。

私が知っていること:

これまでのところ、次のことがわかりました。

  • JAVA_OPTSJDKではなく、他の多くのアプリで使用されます(この投稿を参照)。
  • 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(に加えて、javajavac
  • 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


3
そして、以来、JDK 9+、がありますJDK_JAVA_OPTIONS優先代替として、参照stackoverflow.com/q/52986487/537554
ryenus

回答:


62

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

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

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

UPDATE 2015-08-04:検索エンジンから来た人のために5分節約するために、_JAVA_OPTIONSコマンドライン引数を切り捨て、それが順番に切り捨てJAVA_TOOL_OPTIONSます。


36

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


21

JAVA_OPTSJVMでは特別な処理まったくありません

また、https://bugs.openjdk.java.net/browse/JDK-4971166によると、これJAVA_TOOL_OPTIONSは標準のJVMTI仕様に含まれており、引用符で囲まれたスペースの処理が向上し、ドキュメント化されていないHotspot固有ではなく常に推奨されます_JAVA_OPTIONS

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


@ryenusが指摘したように、JDK 9+以降、推奨される代替としてJDK_JAVA_OPTIONSがあります。Java11を使用する場合のJDK_JAVA_OPTIONSとJAVA_TOOL_OPTIONSの違い何ですか?を参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.