3

スタック サイズを増やした場合 (Java オプション -Xss1M) でのみ適切に実行できるアプリケーションがあります。コマンドラインで -Xss1M オプションを使用すると、機能します。このソリューションを Jenkins ジョブに統合するには、スクリプトの変更ではなく、_JAVA_OPTIONS 環境変数アプローチを使用することをお勧めします。

驚いたことに、「export _JAVA_OPTIONS=-Xss1M」と言ってもうまくいきません。一重引用符と二重引用符を使用して、JAVA_OPTS と JAVA_TOOL_OPTIONS も設定しようとしました。結果は常に同じです。特に奇妙なのは、Java がオプションを「拾った」と書いていることですが、効果はありません。

build@build-solaris-01:tests> /usr/jdk/instances/jdk1.6.0/bin/java -d32 -verbose:gc -classpath ../dist/solaris/forte/prod32mt/cpjdlib.jar: -Djava.library.path=../dist/solaris/forte/prod32mt/dll intern_AFPMMD
Picked up JAVA_TOOL_OPTIONS: -Xss1M
Picked up _JAVA_OPTIONS: -Xss1M
try load: cpjdlib
Successfully loaded library: 'cpjdlib'
 License Valid? true
Segmentation Fault (core dumped)

コマンド ライン オプションとして -Xss1M を使用して同じコマンドを実行すると、次のように動作します。

build@build-solaris-01:tests> /usr/jdk/instances/jdk1.6.0/bin/java -Xss1M -d32 -verbose:gc -classpath ../dist/solaris/forte/prod32mt/cpjdlib.jar: -Djava.library.path=../dist/solaris/forte/prod32mt/dll intern_AFPMMD
Picked up JAVA_TOOL_OPTIONS: -Xss1M
Picked up _JAVA_OPTIONS: -Xss1M
try load: cpjdlib
Successfully loaded library: 'cpjdlib'
 License Valid? true
Success.

SunOS 5.10 と CentOS 4 の両方のマシンで同じ動作をしています。両方でJDK 6 を使用しています。 doc.10142/e14608/app_orminweblogic.htmを参照し、_JAVA_OPTIONS JAVA_TOOL_OPTIONS と JAVA_OPTS の違いを参照して、_JAVA_OPTIONS の使用例を確認してください。_JAVA_OPTIONS が一部のオプションなどを受け入れないかのような言及は見つかりませんでした。したがって、-Xss でも動作するはずです。私の間違いはどこですか?

更新 1 : コマンド ライン オプションの指定と _JAVA_OPTIONS は実際には同等のものではないと確信しました。-Xss だけでなく、他のオプションも同様です。

Ubuntu 14.04 で Java 7 を使用し、-XshowSettings:all オプションを使用して、オプションが Java の「内部」でどのように表示されるかを確認しました。3 つのコマンドを実行し、それらの出力を比較しました (違いは最初の行にありました)。

$ java -XshowSettings:all -version 2>&1 | 頭-5

VM settings:
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM

$ _JAVA_OPTIONS="-Xms2048m -Xmx2048m" Java -XshowSettings:all -バージョン 2>&1 | 頭-5

Picked up _JAVA_OPTIONS: -Xms2048m -Xmx2048m
VM settings:
    Max. Heap Size (Estimated): 1.92G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM

$ Java -Xms2048m -Xmx2048m -XshowSettings:all -バージョン 2>&1 | 頭-5

VM settings:
    Min. Heap Size: 2.00G
    Max. Heap Size: 2.00G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM

これは、同じオプション -Xms、-Xmx が実際に持っていることを意味しますが、_JAVA_OPTIONS アプローチを使用すると、限られた効果しかありません。同じことが -Xss にも当てはまります。

$ _JAVA_OPTIONS="-Xss1m" java -XshowSettings:all -version 2>&1 | 頭-5

Picked up _JAVA_OPTIONS: -Xss1m
VM settings:
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM

$ java -Xss1m -XshowSettings:all -バージョン 2>&1 | 頭-5

VM settings:
    Stack Size: 1.00M
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM

違いは、コマンド ライン オプションで -Xss1m が指定されている場合のみ、「Stack Size: 1.00M」と表示されることです。しかし、なぜ!_JAVA_OPTIONS の下にコマンドラインと完全に同等のものを提供しないのはなぜですか??

更新 2 : http://hg.openjdk.java.net/jdk7/jdk7/hotspot/archive/tip.tar.gzおよびhttp: //hg.openjdk.java.net/jdk7/jdk7/jdk/archive/tip.tar.gzそれぞれ。多くのプリントアウトを挿入し、Java とすべての関連ライブラリ (libjvm.so、rt.jar) をソースからビルドして実行しました。

根本的な原因は、_JAVA_OPTIONS からのオプションが、jdk-9b8c96f96a0f/src/solaris/bin/java_md.c の thr_create() の呼び出しに使用されていない配列 _jvm_args_array に格納されていることです。

スタック サイズを評価しようとする場所があります。これは、ContinueInNewThread(...) からの JNI_GetDefaultJavaVMInitArgs(void *args_) の呼び出しですが、320K に等しいデフォルトのスタック サイズ値を返すだけで、_JAVA_OPTIONS は使用しません。 . _JAVA_OPTIONS の解析は、完全に無意味に見える既に作成されたスレッドで後で行われます。

おそらく関心のある人のために何が起こっているかを説明するために、以下の呼び出しシーケンスを書きました (インデントは呼び出しの深さに対応します)。

[jdk-9b8c96f96a0f/src/share/bin/java.c]: JLI_Launch(...)
   [jdk-9b8c96f96a0f/src/share/bin/java.c]: ContinueInNewThread(InvocationFunctions* ifn, int argc, char **argv, int mode, char *what, int ret) // threadStackSize=0 (not passed via command line)
      [hotspot-9b0ca45cd756/src/share/vm/prims/jni.cpp]: JNI_GetDefaultJavaVMInitArgs(void *args_) // args->javaStackSize=320*1024 (default value is assigned), is called by pointer ifn->GetDefaultJavaVMInitArgs(&args1_1) from jdk-9b8c96f96a0f/src/share/bin/java.c
      [jdk-9b8c96f96a0f/src/solaris/bin/java_md.c]: ContinueInNewThread0(int (JNICALL *continuation)(void *), jlong stack_size, void * args) // threadStackSize=320*1024
      [jdk-9b8c96f96a0f/src/solaris/bin/java_md.c]: thr_create(NULL, stack_size, (void *(*)(void *))continuation, args, flags, &tid) // threadStackSize=320*1024
      [jdk-9b8c96f96a0f/src/share/bin/java.c]: JavaMain(void * args) // called with no arguments (no stack size was passed)!
         [jdk-9b8c96f96a0f/src/share/bin/java.c]: InitializeJVM(&vm, &env, &ifn)
            [hotspot-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]: Arguments::parse() // is called by pointer ifn->CreateJavaVM(pvm, (void **)penv, &args) from jdk-9b8c96f96a0f/src/share/bin/java.c
               [hotspot-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]: Arguments::parse_vm_init_args(args)
                  [hotspot-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]: Arguments::parse_java_tool_options_environment_variable(&scp, &scp_assembly_required);
                     [hotspot-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]: Arguments::parse_options_environment_variable("_JAVA_OPTIONS", scp_p, scp_assembly_required_p); // Here it writes "Picked up _JAVA_OPTIONS: -Xss1m"
                        [hotspot-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]: Arguments::parse_each_vm_init_arg(&vm_args, scp_p, scp_assembly_required_p, ENVIRON_VAR))
                           [hotspot-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]: Arguments::build_jvm_args(option->optionString); // puts the option to _jvm_args_array which is accessible later as jvm_args_array() or jvm_args()
            (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs); // <-Java *.class application execution

現在、OpenJDK にバグを報告する方法を確認しています。OpenJDK がそのような実装を適切に設計されていると見なしたとしても、コマンド ライン ヘルプとドキュメントの両方で、-Xss が _JAVA_OPTIONS からは機能しないことを明確に説明する必要があります。

4

0 に答える 0