Springboot項目java -jar 啓動jar包參數詳解

命令實例:
nohup java -Xms500m -Xmx500m -Xmn250m -Xss256k -server -XX:+HeapDumpOnOutOfMemoryError -jar $JAR_PATH/test-0.0.1-SNAPSHOT.jar --spring.profiles.active=daily -verbose:class &
說明:
–spring.profiles.active=daily, 這個可以在spring-boot啓動中指定系統變量,多環境(測試、預發、線上配置)的區分
在排查jar包衝突時,可以指定啓動的-verbose:class 打印出啓動的應用實際加載類的路徑,來排查來源。
jvm堆設值: -Xms500m -Xmx500m -Xmn250m -Xss256k
nohup 不掛斷地運行命令;& 在後臺運行 ,一般兩個一起用。 eg:nohup command &
-server:服務器模式,在多個CPU時性能佳,啓動慢但性能好,能合理管理內存。
-XX:+HeapDumpOnOutOfMemoryError:在堆溢出時保存快照
可以用 java -X命令在終端查詢所有的java堆參數:
-Xmixed 混合模式執行 (默認)
-Xint 僅解釋模式執行
-Xbootclasspath:<用 : 分隔的目錄和 zip/jar 文件>
設置搜索路徑以引導類和資源
-Xbootclasspath/a:<用 : 分隔的目錄和 zip/jar 文件>
附加在引導類路徑末尾
-Xbootclasspath/p:<用 : 分隔的目錄和 zip/jar 文件>
置於引導類路徑之前
-Xdiag 顯示附加診斷消息
-Xnoclassgc 禁用類垃圾收集
-Xincgc 啓用增量垃圾收集
-Xloggc: 將 GC 狀態記錄在文件中 (帶時間戳)
-Xbatch 禁用後臺編譯
-Xms 設置初始 Java 堆大小
-Xmx 設置最大 Java 堆大小
-Xss 設置 Java 線程堆棧大小
-Xprof 輸出 cpu 配置文件數據
-Xfuture 啓用最嚴格的檢查, 預期將來的默認值
-Xrs 減少 Java/VM 對操作系統信號的使用 (請參閱文檔)
-Xcheck:jni 對 JNI 函數執行其他檢查
-Xshare:off 不嘗試使用共享類數據
-Xshare:auto 在可能的情況下使用共享類數據 (默認)
-Xshare:on 要求使用共享類數據, 否則將失敗。
-XshowSettings 顯示所有設置並繼續
-XshowSettings:all
顯示所有設置並繼續
-XshowSettings:vm 顯示所有與 vm 相關的設置並繼續
-XshowSettings:properties
顯示所有屬性設置並繼續
-XshowSettings:locale
顯示所有與區域設置相關的設置並繼續

-X 選項是非標準選項, 如有更改, 恕不另行通知。

以下選項爲 Mac OS X 特定的選項:
-XstartOnFirstThread
在第一個 (AppKit) 線程上運行 main() 方法
-Xdock:name=<應用程序名稱>"
覆蓋停靠欄中顯示的默認應用程序名稱
-Xdock:icon=<圖標文件的路徑>
覆蓋停靠欄中顯示的默認圖標
-server和-client具體說明:
-server:一定要作爲第一個參數,在多個 CPU 時性能佳,還有一種叫 -client 的模式,特點是啓動速度比較快,但運行時性能和內存管理效率不高,通常用於客戶端應用程序或開發調試,在 32 位環境下直接運行 Java 程序默認啓用該模式。Server 模式的特點是啓動速度比較慢,但運行時性能和內存管理效率很高,適用於生產環境,在具有 64 位能力的 JDK 環境下默認啓用該模式,可以不配置該參數。

-XX:+HeapDumpOnOutOfMemoryError:
該配置會把快照保存在user.dir中,比如你用tomcat啓動,那應該是在tomcat的bin目錄下

當然,也可以通過XX:HeapDumpPath=./java_pid.hprof來顯示指定路徑

此外,OnOutOfMemoryError參數允許用戶指定當出現oom時,指定某個腳本來完成一些動作,比如郵件知會。。。

$ java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError =“sh ~/cleanup.sh” MyApp

其他補充說明:
shell命令重定向綁定:
nohup command >/dev/null 2>&1 &

/dev/null 2>&1。這條命令其實分爲兩命令,一個是>/dev/null,另一個是2>&1。

  1. /dev/null

這條命令的作用是將標準輸出1重定向到/dev/null中。/dev/null代表linux的空設備文件,所有往這個文件裏面寫入的內容都會丟失,俗稱“黑洞”。那麼執行了>/dev/null之後,標準輸出就會不再存在,沒有任何地方能夠找到輸出的內容。

  1. 2>&1

這條命令用到了重定向綁定,採用&可以將兩個輸出綁定在一起。這條命令的作用是錯誤輸出將和標準輸出同用一個文件描述符,說人話就是錯誤輸出將會和標準輸出輸出到同一個地方。

linux在執行shell命令之前,就會確定好所有的輸入輸出位置,並且從左到右依次執行重定向的命令,所以>/dev/null 2>&1的作用就是讓標準輸出重定向到/dev/null中(丟棄標準輸出),然後錯誤輸出由於重用了標準輸出的描述符,所以錯誤輸出也被定向到了/dev/null中,錯誤輸出同樣也被丟棄了。執行了這條命令之後,該條shell命令將不會輸出任何信息到控制檯,也不會有任何信息輸出到文件中。

/dev/null 2>&1 VS 2>&1 >/dev/null

乍眼看這兩條命令貌似是等同的,但其實大爲不同。剛纔提到了,linux在執行shell命令之前,就會確定好所有的輸入輸出位置,並且從左到右依次執行重定向的命令。那麼我們同樣從左到右地來分析2>&1 >/dev/null:

2>&1,將錯誤輸出綁定到標準輸出上。由於此時的標準輸出是默認值,也就是輸出到屏幕,所以錯誤輸出會輸出到屏幕。

/dev/null,將標準輸出1重定向到/dev/null中。
我們用一個表格來更好地說明這兩條命令的區別:

命令 標準輸出 錯誤輸出

/dev/null 2>&1 丟棄 丟棄
2>&1 >/dev/null 丟棄 屏幕
/dev/null 2>&1 VS >/dev/null 2>/dev/null

那麼可能會有些同學會疑問,爲什麼要用重定向綁定,而不是像>/dev/null 2>/dev/null這樣子重複一遍呢。

爲了回答這個問題,我們回到剛纔介紹輸出重定向的場景。我們嘗試將標準輸出和錯誤輸出都定向到out文件中:

#ls a.txt b.txt >out 2>out

#cat out

a.txt

�法訪問b.txt: 沒有那個文件或目錄

WTF?竟然出現了亂碼,這是爲啥呢?這是因爲採用這種寫法,標準輸出和錯誤輸出會搶佔往out文件的管道,所以可能會導致輸出內容的時候出現缺失、覆蓋等情況。現在是出現了亂碼,有時候也有可能出現只有error信息或者只有正常信息的情況。不管怎麼說,採用這種寫法,最後的情況是無法預估的。

而且,由於out文件被打開了兩次,兩個文件描述符會搶佔性的往文件中輸出內容,所以整體IO效率不如>/dev/null 2>&1來得高。

nohup結合
1.nohup

用途:不掛斷地運行命令。

語法:nohup Command [ Arg … ] [ & ]

無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。

如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。

如果沒有文件能創建或打開以用於追加,那麼 Command 參數指定的命令不可調用。

退出狀態:該命令返回下列出口值:

126 可以查找但不能調用 Command 參數指定的命令。

127 nohup 命令發生錯誤或不能查找由 Command 參數指定的命令。

否則,nohup 命令的退出狀態是 Command 參數指定命令的退出狀態。

2.&

用途:在後臺運行

一般兩個一起用

我們經常使用nohup command &命令形式來啓動一些後臺程序,比如一些java服務:

#nohup java -jar xxxx.jar &

爲了不讓一些執行信息輸出到前臺(控制檯),我們還會加上剛纔提到的>/dev/null 2>&1命令來丟棄所有的輸出:

#nohup java -jar xxxx.jar >/dev/null 2>&1 &

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章