ããã¯ããªã«ãããããŠæžãããã®ïŒ
以åãOpenJDKã®ã€ã¡ãŒãžã§éãã§ããæã«ãJAVA_TOOL_OPTIONS
ãšããç°å¢å€æ°ã䜿ãããŠããã®ãèŠãŠã
$ docker container run -it --rm adoptopenjdk/openjdk11:latest java -version Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport openjdk version "11.0.2" 2019-01-15 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.2+9) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.2+9, mixed mode)
ããããªãã ãããšæã£ãŠããã®ã§ãããããã¥ã¡ã³ãã«èšèŒããã£ãããã§ãã
Java VMã«ãªãã·ã§ã³ãæž¡ããç°å¢å€æ°ã®ããã§ãããç¥ããŸããã§ããã
ãã£ãããªã®ã§ãã¡ãããšèŠãŠã¿ããããªããšã
ãŸããçµè«ãæžããŠãããšã
ãããã詊ããŠã¿ããã§ãããæå®æ¹æ³ã¯ããããããã©ãããããçµã¿åãããŠäœ¿ããã®ãããªãã§ããããšããã®ãææ³ã§ãã
远èšïŒ
java
ã³ãã³ãã«é¢ããŠèšããšãJDK_JAVA_OPTIONS
ç°å¢å€æ°ã䜿ããããã§ãã
javaコマンドで使える、JDK_JAVA_OPTIONS環境変数ってなんだ? - CLOVER🍀
JAVA_OPTS
Java VMã«ãªãã·ã§ã³ãæž¡ãç°å¢å€æ°ãšããã°ãJAVA_OPTS
ãæåã ãšæããŸãã
ã§ãããããã¯Java VMããµããŒãããŠããããã§ã¯ãªããããã䜿ãããœãããŠã§ã¢ãå€ãããšãã話ã§ãã
ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã®èµ·åã¹ã¯ãªãããªã©ã«èšè¿°ãããŠããŸãã
Tomcatã
https://github.com/apache/tomcat/blob/9.0.39/bin/catalina.sh
WildFlyã
çµå±ã®ãšãããjava
ã³ãã³ãã®åŒæ°ãšããŠæå®ããã圢ã«å±éãããŸããJava VMãžã®åŒæ°ãç°å¢å€æ°ã§æå®ãããã±ãŒã¹ã§ã
ãã€ç°å¢å€æ°JAVA_OPTS
ã䜿ãããªããããã䜿ãã°ããã®ã§ã¯ãªãããªããšããæ°ãããŸãã
ãã®åŸãèªããšããããŸãããJAVA_TOOL_OPTIONS
ãšã¶ã€ãã£ãŠãJAVA_OPTS
ã®å
容ãåªå
ãããããšã«ãªãã®ã§ã
JAVA_TOOL_OPTIONS
JAVA_TOOL_OPTIONS
ã¯ãJavaã®ããã¥ã¡ã³ãã«èšèŒã®ããç°å¢å€æ°ã§ãã
ãã®ç°å¢å€æ°ã§ã¯ãããŒã«ã®åæå(å ·äœçã«ã¯-agentlibãŸãã¯-javaagentãªãã·ã§ã³ã䜿çšãããã€ãã£ããŸãã¯Javaããã°ã©ãã³ã°èšèªãšãŒãžã§ã³ãã®èµ·å)ãæå®ã§ããŸãã
ãã®å€æ°ã¯ã蚺æã®ç®çã§ã³ãã³ãè¡ãã»ãã®ãªãã·ã§ã³ã䜿ã£ãŠæ¡åŒµããããã«ã䜿çšã§ããŸããããšãã°ã-XX:OnErrorãªãã·ã§ã³ã䜿çšãããšãèŽåœçãšã©ãŒãçºçããå Žåã«å®è¡ãããã¹ã¯ãªãããŸãã¯ã³ãã³ããæå®ã§ããŸãã
ãã®ç°å¢å€æ°ã¯JNI_CreateJavaVM颿°ã®åŒåºãæã«æ€æ»ããããããéåžžã¯ã©ã³ãã£ã«ãã£ãŠåŠçããããªãã·ã§ã³ã䜿çšããã³ãã³ãè¡ã®æ¡åŒµ(-clientãŸãã¯-serverãªãã·ã§ã³ã䜿ã£ãVMéžæãªã©)ã«ã¯äœ¿çšã§ããŸããã
ãªãã»ã©ãã¡ãã£ãšç¢ºèªããŠã¿ãŸãã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã§ãã
$ java --version openjdk 11.0.8 2020-07-14 OpenJDK Runtime Environment (build 11.0.8+10-post-Ubuntu-0ubuntu120.04) OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)
ãµã³ãã«ããã°ã©ã
åäœç¢ºèªçšã®ããµã³ãã«ããã°ã©ã ã¯ãã¡ãã
App.java
public class App { public static void main(String... args) { System.out.printf("my.prop1 = %s %n", System.getProperty("my.prop1")); System.out.printf("my.prop2 = %s %n", System.getProperty("my.prop2")); } }
ã·ã¹ãã ããããã£ã«å€ãæå®ããŠãåäœç¢ºèªã
$ java -Dmy.prop1=value1-from-cli -Dmy.prop2=value2-from-cli App.java my.prop1 = value1-from-cli my.prop2 = value2-from-cli
ãã®ã·ã¹ãã ããããã£ã®æå®æ¹æ³ã«ãç°å¢å€æ°JAVA_TOOL_OPTIONS
ã䜿ã£ãŠã¿ãŸãããã
ç°å¢å€æ°JAVA_TOOL_OPTIONS
ã䜿ã
ãŸãã¯ãç°å¢å€æ°JAVA_TOOL_OPTIONS
ãæå®ããŸãã
$ export JAVA_TOOL_OPTIONS='-Dmy.prop1=value1-from-env-tool-options -Dmy.prop2=value2-from-env-tool-options'
確èªã
$ java App.java Picked up JAVA_TOOL_OPTIONS: -Dmy.prop1=value1-from-env-tool-options -Dmy.prop2=value2-from-env-tool-options my.prop1 = value1-from-env-tool-options my.prop2 = value2-from-env-tool-options
JAVA_TOOL_OPTIONS
ã䜿çšãããããšã衚瀺ãããŸããã
ãã®ãããã£ãœãã§ããã
https://github.com/openjdk/jdk/blob/jdk-11%2B8/src/hotspot/share/runtime/arguments.cpp#L3625-L3626
ã³ãã³ãã§ã®åŒæ°æå®ãšãåæã«è¡ããšã©ããªããã§ãããïŒ
$ java -Dmy.prop1=value1-from-cli -Dmy.prop2=value2-from-cli App.java Picked up JAVA_TOOL_OPTIONS: -Dmy.prop1=value1-from-env-tool-options -Dmy.prop2=value2-from-env-tool-options my.prop1 = value1-from-cli my.prop2 = value2-from-cli
ã³ãã³ãã§ã®åŒæ°ã§æå®ããæ¹ãåªå ãããããã§ãã
å°ããã²ããããïŒïŒïŒæå®ãããŠã¿ãŸããããç°å¢å€æ°ã§ãçæ¹ã®ã·ã¹ãã ããããã£ãæå®ã
$ export JAVA_TOOL_OPTIONS=-Dmy.prop1=value1-from-env-tool-options
ã³ãã³ãã§ã®æå®ã§ã¯ãããçæ¹ãæå®ã
$ java -Dmy.prop2=value2-from-cli App.java Picked up JAVA_TOOL_OPTIONS: -Dmy.prop1=value1-from-env-tool-options my.prop1 = value1-from-env-tool-options my.prop2 = value2-from-cli
ç°å¢å€æ°ã®å
容ããã³ãã³ãã§ã®åŒæ°æå®ã§äžæžãããšããæåã¿ããã§ããããªã®ã§ãã³ãã³ãã§ã®æå®ãšç«¶åããªãã£ããã®ã¯
æ®ããŸãããšã
VM.javaãèŠãŠã¿ã
ãšããã§ãç°å¢å€æ°JAVA_TOOL_OPTIONS
ã®ããšãæžããããœãŒã¹ã³ãŒãã³ã¡ã³ããèŠããšãããå°ããªã«ãæžããŠãããŸãã
/** * Returns the VM arguments for this runtime environment. * * @implNote * The HotSpot JVM processes the input arguments from multiple sources * in the following order: * 1. JAVA_TOOL_OPTIONS environment variable * 2. Options from JNI Invocation API * 3. _JAVA_OPTIONS environment variable * * If VM options file is specified via -XX:VMOptionsFile, the vm options * file is read and expanded in place of -XX:VMOptionFile option. */ public static native String[] getRuntimeArguments();
https://github.com/openjdk/jdk/blob/jdk-11%2B8/src/hotspot/share/runtime/arguments.cpp#L3603-L3609
_JAVA_OPTIONS
ãšããç°å¢å€æ°ãšã-XX:VMOptionFile
ãšãããªãã·ã§ã³ãããããã§ãã
ãã¡ããèŠãŠã¿ãŸããã
ç°å¢å€æ°_JAVA_OPTIONS
ç°å¢å€æ°_JAVA_OPTIONS
ã¯ãããã¥ã¡ã³ãã«èšèŒããªããªãã·ã§ã³ã§ããã
ãšãããããæå®ããŠã¿ãŸãããã
$ export _JAVA_OPTIONS='-Dmy.prop1=value1-from-env-options -Dmy.prop2=value2-from-env-options'
確èªã
$ java App.java Picked up _JAVA_OPTIONS: -Dmy.prop1=value1-from-env-options -Dmy.prop2=value2-from-env-options my.prop1 = value1-from-env-options my.prop2 = value2-from-env-options
確ãã«ãåæ ãããŸããã
ãã®ç¶æ
ã§ãç°å¢å€æ°JAVA_TOOL_OPTIONS
ãæå®ããŠã¿ãŸãã
$ export JAVA_TOOL_OPTIONS='-Dmy.prop1=value1-from-env-tool-options -Dmy.prop2=value2-from-env-tool-options'
確èªã
$ java App.java Picked up JAVA_TOOL_OPTIONS: -Dmy.prop1=value1-from-env-tool-options -Dmy.prop2=value2-from-env-tool-options Picked up _JAVA_OPTIONS: -Dmy.prop1=value1-from-env-options -Dmy.prop2=value2-from-env-options my.prop1 = value1-from-env-options my.prop2 = value2-from-env-options
_JAVA_OPTIONS
ãåŸåã¡ã«ãªãããã§ãã
ã§ã¯ãã³ãã³ãåŒæ°ããæå®ãããšâŠ
$ java -Dmy.prop1=value1-from-cli -Dmy.prop2=value2-from-cli App.java Picked up JAVA_TOOL_OPTIONS: -Dmy.prop1=value1-from-env-tool-options -Dmy.prop2=value2-from-env-tool-options Picked up _JAVA_OPTIONS: -Dmy.prop1=value1-from-env-options -Dmy.prop2=value2-from-env-options my.prop1 = value1-from-env-options my.prop2 = value2-from-env-options
äžæžãããâŠãªãã
ã¡ãã£ãš1床ããªã»ããã
$ unset _JAVA_OPTIONS $ unset JAVA_TOOL_OPTIONS
_JAVA_OPTIONS
ã ãã®æå®ã«ããŠã¿ãŸãã
$ export _JAVA_OPTIONS='-Dmy.prop1=value1-from-env-options -Dmy.prop2=value2-from-env-options'
ãã£ã±ãå€ãããªãããã§ãã
$ java -Dmy.prop1=value1-from-cli -Dmy.prop2=value2-from-cli App.java Picked up _JAVA_OPTIONS: -Dmy.prop1=value1-from-env-options -Dmy.prop2=value2-from-env-options my.prop1 = value1-from-env-options my.prop2 = value2-from-env-options
Java VMãžçŽæ¥åŒæ°ãæå®ããå Žåã£ãŠã
Options from JNI Invocation API
ã«è©²åœãããã§ãããããâŠïŒ
æ··ããŠã¿ãŸãã
$ export _JAVA_OPTIONS=-Dmy.prop1=value1-from-env-options $ export JAVA_TOOL_OPTIONS=-Dmy.prop2=value2-from-env-tool-options $ java App.java Picked up JAVA_TOOL_OPTIONS: -Dmy.prop2=value2-from-env-tool-options Picked up _JAVA_OPTIONS: -Dmy.prop1=value1-from-env-options my.prop1 = value1-from-env-options my.prop2 = value2-from-env-tool-options $ java -Dmy.prop1=value1-from-cli -Dmy.prop2=value2-from-cli App.java Picked up JAVA_TOOL_OPTIONS: -Dmy.prop2=value2-from-env-tool-options Picked up _JAVA_OPTIONS: -Dmy.prop1=value1-from-env-options my.prop1 = value1-from-env-options my.prop2 = value2-from-cli
é¢çœãã§ããã
ãŸããããã¥ã¡ã³ãã«æžãããŠããã®ã¯JAVA_TOOL_OPTIONS
ã§ããã䜿ããªããã¡ãã§ããããã
-XX:VMOptionsFile
æåŸã-XX:VMOptionsFile
ãšãããªãã·ã§ã³ã«ã€ããŠãJava 9ã§å¢ãããã§ãããããïŒ
javaã®æ¡åŒµã©ã³ã¿ã€ã ã»ãªãã·ã§ã³
-XX:VMOptionsFile=filename
ãŠãŒã¶ãŒãVMãªãã·ã§ã³ããã¡ã€ã«ã«æå®ã§ããããã«ããŸãã
察å¿ããŠãããªãã±ããããããŸããã
[JDK-8061999] Enhance VM option parsing to allow options to be specified in a file - Java Bug System
[JDK-8141358] Document -XX:VMOptionsFile - Java Bug System
ãã¡ãã詊ããŠã¿ãŸãããã
ãããŸãæ å ±ããªãã®ã§ããã®ããããåèã«ã
https://github.com/openjdk/jdk/blob/jdk-11%2B8/src/hotspot/share/runtime/arguments.cpp#L3573-L3601
https://github.com/openjdk/jdk/tree/jdk-11+8/test/hotspot/jtreg/runtime/CommandLine/VMOptionsFile
ãããªãã¡ã€ã«ãäœæã
options.conf
-Dmy.prop1=value1-from-option-file -Dmy.prop2=value2-from-option-file
å®è¡ã
$ java -XX:VMOptionsFile=options.conf App.java my.prop1 = value1-from-option-file my.prop2 = value2-from-option-file
èªèããŸããã
ã³ãã³ãã©ã€ã³ããåæã«æå®ããå Žåã¯ããªãã·ã§ã³ã®äœçœ®ã«åœ±é¿ãåããããã§ãã
$ java -XX:VMOptionsFile=options.conf -Dmy.prop1=value1-from-cli -Dmy.prop2=value2-from-cli App.java my.prop1 = value1-from-cli my.prop2 = value2-from-cli $ java -Dmy.prop1=value1-from-cli -Dmy.prop2=value2-from-cli -XX:VMOptionsFile=options.conf App.java my.prop1 = value1-from-option-file my.prop2 = value2-from-option-file
ç°å¢å€æ°ã䜿ããã¿ãŒã³ã詊ããŠã¿ãŸãããã
ç°å¢å€æ°JAVA_TOOL_OPTIONS
ãæå®ã
$ export JAVA_TOOL_OPTIONS='-Dmy.prop1=value1-from-env-tool-options -Dmy.prop2=value2-from-env-tool-options'
ããã¯ã-XX:VMOptionsFile
ã®æ¹ãåªå
ã§ããã
$ java -XX:VMOptionsFile=options.conf App.java Picked up JAVA_TOOL_OPTIONS: -Dmy.prop1=value1-from-env-tool-options -Dmy.prop2=value2-from-env-tool-options my.prop1 = value1-from-option-file my.prop2 = value2-from-option-file
ç°å¢å€æ°_JAVA_OPTIONS
ã䜿ãå Žåã
$ export _JAVA_OPTIONS='-Dmy.prop1=value1-from-env-options -Dmy.prop2=value2-from-env-options' $ java -XX:VMOptionsFile=options.conf App.java Picked up _JAVA_OPTIONS: -Dmy.prop1=value1-from-env-options -Dmy.prop2=value2-from-env-options my.prop1 = value1-from-env-options my.prop2 = value2-from-env-options
ãããŸãã_JAVA_OPTIONS
ã®æ¹ãåªå
ã¿ããã§ããã
ãšããããšã¯ãåªå 床çã«ã¯ã³ãã³ãã©ã€ã³ã§ã®åŒæ°æå®ãšåãããã§ããã
éšåçãªå®çŸ©ã«ããŠæ··ããŠã¿ãŸãããã
options-partial.conf
-Dmy.prop2=value2-from-option-file
確èªã
$ java -XX:VMOptionsFile=options-partial.conf -Dmy.prop1=value1-from-cli App.java my.prop1 = value1-from-cli my.prop2 = value2-from-option-file
䜵çšã¯å¯ãã§ããšã
ç°å¢å€æ°ãå ããŠã¿ãŸãã
$ export JAVA_TOOL_OPTIONS=-Dmy.prop1=value1-from-env-tool-options $ java -XX:VMOptionsFile=options-partial.conf App.java Picked up JAVA_TOOL_OPTIONS: -Dmy.prop1=value1-from-env-tool-options my.prop1 = value1-from-env-tool-options my.prop2 = value2-from-option-file
ãããã䜿ãããã§ããã
_JAVA_OPTIONS
ãã
$ export _JAVA_OPTIONS=-Dmy.prop1=value1-from-env-options $ java -XX:VMOptionsFile=options-partial.conf App.java Picked up _JAVA_OPTIONS: -Dmy.prop1=value1-from-env-options my.prop1 = value1-from-env-options my.prop2 = value2-from-option-file
ãŸãšã
Java VMã«ãåŒæ°ãæå®ããæ¹æ³ããããã詊ããŠã¿ãŸããã
ç°å¢å€æ°ããã¡ã€ã«æå®ãã³ãã³ãã«çŽæ¥æå®çã ã
ãããã詊ããŠã¿ãŠæããŸããããèšå®ã®æ¹æ³ã¯ããã€ãããã©ãå®éã«æå®ããæã«ã¯ã©ããå°ãªãçµãããã§ããã
ã©ããåªå ããããšãèŠããŠãããªãã§ããããã®å ãæåãå€ãããããããªãã§ããâŠã