命令實例:
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:<file> 將 GC 狀態記錄在文件中 (帶時間戳)
-Xbatch 禁用后台編譯
-Xms<size> 設置初始 Java 堆大小
-Xmx<size> 設置最大 Java 堆大小
-Xss<size> 設置 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之后,標准輸出就會不再存在,沒有任何地方能夠找到輸出的內容。
2. 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 &