最近調試一些關於Java內存的東西,把以前一直沒能整理,只是大概有個概念的東西翻出來了一下。
Java的命令行參數,在此前作web開發的時候,不是很經常使用到,若是徹底沒有用到過也能理解,畢竟沒搞炸過,沒gc過,jvm(sun jdk)的一些默認參數已經足夠,web的東西只要環境相差不是太厲害,都不必用到遠程調試。
作過Java命令行工具開發的可能會使用一些,例如java -cp example.jar -option_a value_a 這樣的技巧,或者封裝一下成爲一個工具包。用來給一些屬性賦值,更新手的操做(也有多是爲了省事兒)會按一些例如,java -cp example.jar a b c 按順序分別入參。對於一些框架,Apache MapReduce或是Spring Cloud這樣的,就會看到-Dexample.options=xx這樣的入參。
那這時候就會有一個問題,即框架、你本身的代碼(程序入參)、jvm參數三方混一塊兒的狀況。也就是爲何要把它們區分開來,這樣,咱們本身設計一些參數的時候可以更加合理,有的權衡。
下面列出了一些目前我所知道的狀況。
1.Java 命令行工具參數
例如:-verbose -jar -cp 之類的一些參數,這部分參數是Java可執行文件自己接受的參數。
2.系統參數(不要和環境變量混掉)
例如:
-Djava.compiler=NONE -Djava.security.auth.login.config (例如kafka認證) ,這些以-D參數開頭的,能夠經過System.getProperty("key")取得,注意環境變量是System.getenv(),不要把它們搞混
這部分很難找到確切的參考,取決於你使用的框架,可使用的系統變量截然不同。關於Java 自身可使用的,則能夠在sun官方的指南中看到,具體放這邊(失效能夠搜索Java oracle tutorial,慢慢找)
關於上文也提到的
-Djava.security.auth.login.config 這個選項呢,則是JAAS標準的一部分,能夠在這邊找到參考,
3.JVM參數
例如-X,以及-XX參數,這部分的參考就不少了,stackoverflow上面有個回答貼心的將它們分紅4大類,固然也不必定要分類強迫症,大概理下思路能夠
These options are general purpose options that are specific to the Java HotSpot Virtual Machine.
For example : -Xmssize, -Xmxsize
These options control the runtime behavior of the Java HotSpot VM.
These options control the dynamic just-in-time (JIT) compilation performed by the Java HotSpot VM.
These options provide the ability to gather system information and perform extensive debugging.
These options control how garbage collection (GC) is performed by the Java HotSpot VM.
問題的本質:
入參問題的本質,在於java命令行工具按照約定(這部分我找不到規範,對openjdk沒有研究,只知道兼容性各類報錯)
將參數解析,而後發送往不一樣的部分,一部分是Java虛擬機要的,一部分是用戶的主類要的,還有一部分是告訴工具自身如何尋址。當Java自身把本身須要的部分徹底取走以後,剩下的就是用戶主類的入參了,有點相似保留字,奈何沒有規範,只能看到目前的參考去避讓這部分。那難道咱們本身的入參只能剩下依序嗎?
因而回到咱們最開始的問題,咱們本身設計參數的時候,若是文明禮讓地去避讓上面的幾大類,好比爲避免和Java 參數類似,不用-; --;開頭,同時爲了避免和框架混一塊兒,不使用-D參數,天然也用不了-X -XX參數。真就按序解析?個人答案,學他們,
加前綴!或者你自身要開發一個框架,那不介意-D參數也能夠,畢竟有系統API參數能夠調用,何樂不爲
就先寫到這裏,這麼說吧,編程的東西,你不知道源頭,很大程度上等於,你什麼都不知道
PS,遠程調試?check here_