參考鏈接:https://blog.csdn.net/ldx891113/article/details/51735171
命令實(shí)例:
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故黑, 這個(gè)可以在spring-boot啟動(dòng)中指定系統(tǒng)變量苏揣,多環(huán)境(測試、預(yù)發(fā)吓蘑、線上配置)的區(qū)分
在排查jar包沖突時(shí)渠退,可以指定啟動(dòng)的-verbose:class 打印出啟動(dòng)的應(yīng)用實(shí)際加載類的路徑攘乒,來排查來源。
jvm堆設(shè)值: -Xms500m -Xmx500m -Xmn250m -Xss256k
nohup 不掛斷地運(yùn)行命令构蹬;& 在后臺運(yùn)行 王暗,一般兩個(gè)一起用。 eg:nohup command &
-server:服務(wù)器模式庄敛,在多個(gè)CPU時(shí)性能佳俗壹,啟動(dòng)慢但性能好,能合理管理內(nèi)存藻烤。
-XX:+HeapDumpOnOutOfMemoryError:在堆溢出時(shí)保存快照
可以用 java -X命令在終端查詢所有的java堆參數(shù):
-Xmixed 混合模式執(zhí)行 (默認(rèn))
-Xint 僅解釋模式執(zhí)行
-Xbootclasspath:<用 : 分隔的目錄和 zip/jar 文件>
設(shè)置搜索路徑以引導(dǎo)類和資源
-Xbootclasspath/a:<用 : 分隔的目錄和 zip/jar 文件>
附加在引導(dǎo)類路徑末尾
-Xbootclasspath/p:<用 : 分隔的目錄和 zip/jar 文件>
置于引導(dǎo)類路徑之前
-Xdiag 顯示附加診斷消息
-Xnoclassgc 禁用類垃圾收集
-Xincgc 啟用增量垃圾收集
-Xloggc:<file> 將 GC 狀態(tài)記錄在文件中 (帶時(shí)間戳)
-Xbatch 禁用后臺編譯
-Xms<size> 設(shè)置初始 Java 堆大小
-Xmx<size> 設(shè)置最大 Java 堆大小
-Xss<size> 設(shè)置 Java 線程堆棧大小
-Xprof 輸出 cpu 配置文件數(shù)據(jù)
-Xfuture 啟用最嚴(yán)格的檢查, 預(yù)期將來的默認(rèn)值
-Xrs 減少 Java/VM 對操作系統(tǒng)信號的使用 (請參閱文檔)
-Xcheck:jni 對 JNI 函數(shù)執(zhí)行其他檢查
-Xshare:off 不嘗試使用共享類數(shù)據(jù)
-Xshare:auto 在可能的情況下使用共享類數(shù)據(jù) (默認(rèn))
-Xshare:on 要求使用共享類數(shù)據(jù), 否則將失敗策肝。
-XshowSettings 顯示所有設(shè)置并繼續(xù)
-XshowSettings:all
顯示所有設(shè)置并繼續(xù)
-XshowSettings:vm 顯示所有與 vm 相關(guān)的設(shè)置并繼續(xù)
-XshowSettings:properties
顯示所有屬性設(shè)置并繼續(xù)
-XshowSettings:locale
顯示所有與區(qū)域設(shè)置相關(guān)的設(shè)置并繼續(xù)
-X 選項(xiàng)是非標(biāo)準(zhǔn)選項(xiàng), 如有更改, 恕不另行通知。
以下選項(xiàng)為 Mac OS X 特定的選項(xiàng):
-XstartOnFirstThread
在第一個(gè) (AppKit) 線程上運(yùn)行 main() 方法
-Xdock:name=<應(yīng)用程序名稱>"
覆蓋鸵啵靠欄中顯示的默認(rèn)應(yīng)用程序名稱
-Xdock:icon=<圖標(biāo)文件的路徑>
覆蓋椭冢靠欄中顯示的默認(rèn)圖標(biāo)
-server和-client具體說明:
-server:一定要作為第一個(gè)參數(shù),在多個(gè) CPU 時(shí)性能佳依许,還有一種叫 -client 的模式棺禾,特點(diǎn)是啟動(dòng)速度比較快,但運(yùn)行時(shí)性能和內(nèi)存管理效率不高峭跳,通常用于客戶端應(yīng)用程序或開發(fā)調(diào)試膘婶,在 32 位環(huán)境下直接運(yùn)行 Java 程序默認(rèn)啟用該模式。Server 模式的特點(diǎn)是啟動(dòng)速度比較慢蛀醉,但運(yùn)行時(shí)性能和內(nèi)存管理效率很高悬襟,適用于生產(chǎn)環(huán)境,在具有 64 位能力的 JDK 環(huán)境下默認(rèn)啟用該模式拯刁,可以不配置該參數(shù)脊岳。
-XX:+HeapDumpOnOutOfMemoryError:
該配置會把快照保存在user.dir中,比如你用tomcat啟動(dòng)垛玻,那應(yīng)該是在tomcat的bin目錄下
當(dāng)然割捅,也可以通過XX:HeapDumpPath=./java_pid.hprof來顯示指定路徑
此外,OnOutOfMemoryError參數(shù)允許用戶指定當(dāng)出現(xiàn)oom時(shí)帚桩,指定某個(gè)腳本來完成一些動(dòng)作亿驾,比如郵件知會。账嚎。莫瞬。
$ java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" MyApp
其他補(bǔ)充說明:
shell命令重定向綁定:
nohup command >/dev/null 2>&1 &
/dev/null 2>&1儡蔓。這條命令其實(shí)分為兩命令,一個(gè)是>/dev/null疼邀,另一個(gè)是2>&1喂江。
/dev/null
這條命令的作用是將標(biāo)準(zhǔn)輸出1重定向到/dev/null中。/dev/null代表linux的空設(shè)備文件檩小,所有往這個(gè)文件里面寫入的內(nèi)容都會丟失,俗稱“黑洞”烟勋。那么執(zhí)行了>/dev/null之后规求,標(biāo)準(zhǔn)輸出就會不再存在,沒有任何地方能夠找到輸出的內(nèi)容卵惦。
- 2>&1
這條命令用到了重定向綁定阻肿,采用&可以將兩個(gè)輸出綁定在一起。這條命令的作用是錯(cuò)誤輸出將和標(biāo)準(zhǔn)輸出同用一個(gè)文件描述符沮尿,說人話就是錯(cuò)誤輸出將會和標(biāo)準(zhǔn)輸出輸出到同一個(gè)地方丛塌。
linux在執(zhí)行shell命令之前,就會確定好所有的輸入輸出位置畜疾,并且從左到右依次執(zhí)行重定向的命令赴邻,所以>/dev/null 2>&1的作用就是讓標(biāo)準(zhǔn)輸出重定向到/dev/null中(丟棄標(biāo)準(zhǔn)輸出),然后錯(cuò)誤輸出由于重用了標(biāo)準(zhǔn)輸出的描述符啡捶,所以錯(cuò)誤輸出也被定向到了/dev/null中姥敛,錯(cuò)誤輸出同樣也被丟棄了。執(zhí)行了這條命令之后瞎暑,該條shell命令將不會輸出任何信息到控制臺彤敛,也不會有任何信息輸出到文件中。
/dev/null 2>&1 VS 2>&1 >/dev/null
乍眼看這兩條命令貌似是等同的了赌,但其實(shí)大為不同墨榄。剛才提到了,linux在執(zhí)行shell命令之前勿她,就會確定好所有的輸入輸出位置袄秩,并且從左到右依次執(zhí)行重定向的命令。那么我們同樣從左到右地來分析2>&1 >/dev/null:
2>&1逢并,將錯(cuò)誤輸出綁定到標(biāo)準(zhǔn)輸出上播揪。由于此時(shí)的標(biāo)準(zhǔn)輸出是默認(rèn)值,也就是輸出到屏幕筒狠,所以錯(cuò)誤輸出會輸出到屏幕猪狈。
/dev/null,將標(biāo)準(zhǔn)輸出1重定向到/dev/null中辩恼。
我們用一個(gè)表格來更好地說明這兩條命令的區(qū)別:
命令 標(biāo)準(zhǔn)輸出 錯(cuò)誤輸出
/dev/null 2>&1 丟棄 丟棄
2>&1 >/dev/null 丟棄 屏幕
/dev/null 2>&1 VS >/dev/null 2>/dev/null
那么可能會有些同學(xué)會疑問雇庙,為什么要用重定向綁定谓形,而不是像>/dev/null 2>/dev/null這樣子重復(fù)一遍呢。
為了回答這個(gè)問題疆前,我們回到剛才介紹輸出重定向的場景寒跳。我們嘗試將標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出都定向到out文件中:
1
2
3
4
ls a.txt b.txt >out 2>out
cat out
a.txt
?法訪問b.txt: 沒有那個(gè)文件或目錄
WTF?竟然出現(xiàn)了亂碼竹椒,這是為啥呢童太?這是因?yàn)椴捎眠@種寫法,標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出會搶占往out文件的管道胸完,所以可能會導(dǎo)致輸出內(nèi)容的時(shí)候出現(xiàn)缺失书释、覆蓋等情況。現(xiàn)在是出現(xiàn)了亂碼赊窥,有時(shí)候也有可能出現(xiàn)只有error信息或者只有正常信息的情況爆惧。不管怎么說,采用這種寫法锨能,最后的情況是無法預(yù)估的扯再。
而且,由于out文件被打開了兩次址遇,兩個(gè)文件描述符會搶占性的往文件中輸出內(nèi)容熄阻,所以整體IO效率不如>/dev/null 2>&1來得高。
nohup結(jié)合
1.nohup
用途:不掛斷地運(yùn)行命令倔约。
語法:nohup Command [ Arg … ] [ & ]
無論是否將 nohup 命令的輸出重定向到終端饺律,輸出都將附加到當(dāng)前目錄的 nohup.out 文件中。
如果當(dāng)前目錄的 nohup.out 文件不可寫跺株,輸出重定向到 $HOME/nohup.out 文件中复濒。
如果沒有文件能創(chuàng)建或打開以用于追加,那么 Command 參數(shù)指定的命令不可調(diào)用乒省。
退出狀態(tài):該命令返回下列出口值:
126 可以查找但不能調(diào)用 Command 參數(shù)指定的命令巧颈。
127 nohup 命令發(fā)生錯(cuò)誤或不能查找由 Command 參數(shù)指定的命令。
否則袖扛,nohup 命令的退出狀態(tài)是 Command 參數(shù)指定命令的退出狀態(tài)砸泛。
2.&
用途:在后臺運(yùn)行
一般兩個(gè)一起用
我們經(jīng)常使用nohup command &命令形式來啟動(dòng)一些后臺程序,比如一些java服務(wù):
1
nohup java -jar xxxx.jar &
為了不讓一些執(zhí)行信息輸出到前臺(控制臺)蛆封,我們還會加上剛才提到的>/dev/null 2>&1命令來丟棄所有的輸出:
1