遇到一個很有意思的問題,Jvm進程因系統資源不足時會被操作系統kill掉,當守護進程重新拉起該進程時,會產生一個日志文件:hs_err_pid.log,默認情況下這個日志會被生成到工作目錄下。今天為了修改這個默認路徑,復現了一下Jvm進程OOM后Crash的情況。
那么OOM究竟會不會導致Jvm進程被Crash掉呢?今天上網查了下資料和自己測試了下,結果是oom不會導致Jvm進程被Crash,而是oom只會導致當前線程被回收掉。
如何復現這個問題呢?有意思的是,發現了一個很有意思的Jvm參數 -XX:+CrashOnOutOfMemoryError,這個參數的大概意思是:當發生內存溢出的時,JVM就會退出,同時,JVM會產生文本和二進制格式的崩潰日志。
進程Crash解決了,那如何產生oom呢,我這里修改kafka Broker端的內存,降低堆內存,使kafka服務啟動時Jvm內存產生oom錯誤。
oom有了,如何修改hs_err_pid.log的默認路徑呢?有意思的是,又發現了第二個有趣的Jvm參數:-XX:ErrorFile=~/log/hs_err_pid_%p.log,%p的作用是獲取當前進程的pid。
上面兩個Jvm參數添加如下圖示:
是不是現在啟動Kafka進程,等着oom,然后生成hs_err_pid.log就行了呢?
NO!
這里java虛擬機又給我反饋了個問題,它不識別-XX:+CrashOnOutOfMemoryError參數,它竟然跟我說它不認識它!!!
好吧,我大聲告訴你,jdk在1.8.0_92版本修復了這個問題,所以升級你的jdk到這個版本之上吧。
萬事大吉,只欠啟動,完事。
本文介紹的兩個參數算是比較冷門的Jvm參數了,所以,有機會能遇到,覺得還是很有意思的。
歡迎關注我的微信公眾號《小沈干貨》獲取更多學習內容。