1、JAVA_TOOL_OPTIONS是何物
有些應用不方便設置JVM參數,如命令行應用、通過JNI(Java Native Interface)API調用虛擬機的應用、腳本嵌入虛擬機中的應用等。這種情況環境變量JAVA_TOOL_OPTIONS就非常有用了,它會被JNI API的JNI_CreateJavaVM函數使用。
Note:
在有些場景為了安全考慮環境變量JAVA_TOOL_OPTIONS是被禁用的,比如Solaris系統中但有效用戶ID或組ID不是實際ID時則禁用此環境變量。
因為JAVA_TOOL_OPTIONS是被被JNI_CreateJavaVM調用的,顧名思義是創建VM,因此有些參數是不能被設置的如選擇虛擬機運行模式-client或-server。
2、各種OPTIONS的區別
也許你經常遇到JAVA_OPTS、_JAVA_OPTIONS和JAVA_TOOL_OPTIONS,那么他們有什么不同呢?
JAVA_OPTS:常用於一些應用的配置,如Tomcat,但它一般不作為環境變量,也不能被JVM識別的,是那些應用的自定義配置;
_JAVA_OPTIONS:也是作為環境變量來替代命令行參數的,但它是JVM廠家自定義的,可以覆蓋JAVA_TOOL_OPTIONS,但各廠家的不同,_JAVA_OPTIONS是Oracle的JVM,而IBM的則是用IBM_JAVA_OPTIONS。
JAVA_TOOL_OPTIONS:是標准的,所有虛擬機都能識別和應用的。
如果想驗證上面的不同也不難,如果設置了JVM能識別的環境變量,JVM會有"Picked up"的提示的,如:
export JAVA_OPTS=zhaiqiafneng
export JAVA_TOOL_OPTIONS="-Xmx512m -Xms64m"
java -version
JVM會打印:
Picked up JAVA_TOOL_OPTIONS: -Xmx512m -Xms64m
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
可見JAVA_TOOL_OPTIONS能被JVM識別,而JAVA_OPTS不能被識別。
可以通過設置-Xmx的值觸發“Too small initial heap”異常連檢測覆蓋(當然你也可以通過其他方式):
export JAVA_TOOL_OPTIONS="-Xmx512m -Xms64m"
export _JAVA_OPTIONS="-Xmx1k -Xms1k"
java -version
JVM會打印
Picked up JAVA_TOOL_OPTIONS: -Xmx512m -Xms64m
Picked up _JAVA_OPTIONS: -Xmx1k -Xms1k
Error occurred during initialization of VM
Too small initial heap
可見_JAVA_OPTIONS覆蓋了JAVA_TOOL_OPTIONS.
解決的經典問題
JAVA_TOOL_OPTIONS用於解決的經典問題是使用命令行導致中文亂碼,如:
........
/HController.java:181: error: unmappable character for encoding GBK
// ��?后的發�??
^
/HController.java:181: error: unmappable character for encoding GBK
// ��?后的發�??
^
.......
通過設置環境變量JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"一般可以解決,如果不能解決,就要根據你具體的編碼來設置下就好。
————————————————
版權聲明:本文為CSDN博主「weixin_39614754」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_39614754/article/details/114812483