<BEA-000388> <JVM called WLS shutdown hook. The server will force shutdown now>
在生產weblogic部署環境,發現weblogic每隔幾個小時就shutdown一次,經過跟蹤發現既不是內存問題,也不是數據庫連接池問題,更不是訪問量過大引起。
查詢相關日誌,只有以下幾句shutdown的日誌:
<BEA-000388> <JVM called WLS shutdown hook. The server will force shutdown now>
<BEA-000396> <Server shutdown has been requested by <WLS Kernel>>
<BEA-000365> <Server state changed to FORCE_SUSPENDING>
從上面的日誌看來,更像是人為關閉weblogic產生的日誌(實際並沒有人為操作),一時間感覺沒有頭緒。經過半年多的查詢各種相關資料,把問題範圍鎖定到jdk的相關問題。看到某文章上有一段話,大概是這樣:When WebLogic Server running with the Sun JVM is shutdown, it is because there is a unwanted operating system call terminating the process.意思是說:當你的weblogic使用sun jvm時出現shutdown現象,是系統的一個不必要的操作,導致要關閉這個進程。而我的weblogic剛好使用的是sun jvm。
該問題解決方案如下:
確認你的weblogic使用的jdk是sun jdk還是JRockit jdk,然後需要在JAVA_OPTIONS加入以下參數
A sun jdk-加: -Djava.awt.headless=true -Xrs( -Djava.awt.headless=true可以不用)
B JRockit jdk-加: -Xnohup
所以找到 setdomainenv.sh,在文件的最後找到 JAVA_OPTIONS="${JAVA_OPTIONS}"改成JAVA_OPTIONS="${JAVA_OPTIONS} -Djava.awt.headless=true -Xrs
關於修改JAVA_OPTIONS其實在很多相啟動時的配置文件都可以修改,以上是linux環境weblogic修改方案。
原理:
-Xrs來
設置XRS阻止了Java:trademark:運行時間環境處理任何內部或外部產生的信號,如SIGSEGV和SIGABRT。提出的任何信號都默認的操作系統處理程序處理。在JVM中禁用信號處理降低約2-4%的性能,這取決於應用程序。
SIGABRT是中止一個程序,它可以被捕捉,但不能被阻塞。處理函數返回後,所有打開的文件描述符將會被關閉,流也會被flush。程序會結束,有可能的話還會core
dump。
當程序調用abort(3)時,該進程會向自己發送SIGABRT信號。所以,SIGABRT一般用於信號中一些關鍵的處理,assert失敗時也會使用它。你不應該去捕捉SIGSEGV和SIGABRT信號,如果收到這種信號,說明進程處於一個不確定的狀態,很可能會直接掛起。
<BEA-000388> <JVM called WLS shutdown hook. The server will force shutdown now>