首頁 > Java > 如何讓 JVM 在 SIGSEGV 崩潰後快速退出?

如何讓 JVM 在 SIGSEGV 崩潰後快速退出?

WBOY
發布: 2024-02-09 19:09:09
轉載
1079 人瀏覽過

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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板