php小編西瓜為你解答,當 JVM 在遇到 SIGSEGV 崩潰時,可以採取一些措施來快速退出。首先,可以透過設定 JVM 參數 -XX: CrashOnOutOfMemoryError 來使 JVM 在記憶體溢位時崩潰並快速退出。其次,可以使用 Java 的異常處理機制來捕獲 SIGSEGV 異常,並在捕獲到異常後呼叫 System.exit() 方法來退出程式。此外,還可以使用 JNI 介面來與作業系統進行交互,透過呼叫作業系統提供的退出方法來實現快速退出。總之,透過合理設定 JVM 參數和使用適當的異常處理機制,可以讓 JVM 在 SIGSEGV 崩潰後快速退出,提高程式的穩定性和可靠性。
我們的一項服務由於 tensorflow java 的某些問題而經常崩潰。我們可以接受(k8s 會重新啟動它,很多實例)。問題是 jvm 需要幾分鐘才能終止。有沒有辦法在本機程式碼中強制快速退出 sigsegv?
corrupted size vs. prev_size while consolidating # # a fatal error has been detected by the java runtime environment: # # sigsegv (0xb) at pc=0x00007fe4f321a898, pid=1, tid=545 # # jre version: openjdk runtime environment zulu21.28+85-ca (21.0+35) (build 21+35) # java vm: openjdk 64-bit server vm zulu21.28+85-ca (21+35, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64) # problematic frame: # c [libc.so.6+0x28898] abort+0x178 # # core dump will be written. default location: /data/core # # an error report file with more information is saved as: # /data/hs_err_pid1.log
幾分鐘後:
# [ timer expired, abort... ] [thread 1037 also had an error]
新增以下 jvm 選項:
-xx:+suppressfatalerrormessage -xx:-createcoredumponcrash
這將強制 jvm 在 sigsegv 上立即終止,而不建立錯誤報告或核心轉儲。如果您仍然想看到致命錯誤訊息,請將 -xx: suppressfatalerrormessage
替換為 -xx:errorlogtimeout=1
。
我懷疑這個 jvm 正在運行一個相當大的堆 (> 64 gb),並且對於使用如此多內存的進程來說,寫出核心轉儲文件只需要一段時間:
# Core dump will be written. Default location: /data/core
在這需要的幾分鐘內,您可能會看到核心轉儲檔案在上述位置不斷增長(這將是確認此理論的簡單方法)。
補救措施是停用核心轉儲檔案的創建,其詳細資訊取決於您的特定作業系統(但幾乎可以在任何基於 unix 的作業系統上停用核心轉儲)。 此外,該特定位置可能存在一些與檔案系統相關的瓶頸,導致核心轉儲的寫入速度比預期慢。
以上是如何讓 JVM 在 SIGSEGV 崩潰後快速退出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!