AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

解決 Java 打印日志吞異常堆棧的問題

來源: 責編: 時間:2023-09-18 21:40:35 277觀看
導讀前幾天有同學找我查一個空指針問題,Java 打印日志時,異常堆棧信息被吞了,導致定位不到出問題的地方。現象捕獲異常打印日志的代碼類似這樣:try { // ...} catch (Exception e) { log.error("系統異常 customerCode:

前幾天有同學找我查一個空指針問題,Java 打印日志時,異常堆棧信息被吞了,導致定位不到出問題的地方。Xit28資訊網——每日最新資訊28at.com

Xit28資訊網——每日最新資訊28at.com

現象

捕獲異常打印日志的代碼類似這樣:Xit28資訊網——每日最新資訊28at.com

try {    // ...} catch (Exception e) {    log.error("系統異常 customerCode:{},data:{}", customerCode, data, e);    // ...}

查到的日志是這樣的:Xit28資訊網——每日最新資訊28at.com

2023-06-26 11:11:11.111 ERROR 1 --- [pool-1-thread-1] c.mazhuang.service.impl.TestServiceImpl  : 系統異常 customerCode:123,data:{"name":"mazhuang","age":18}java.lang.NullPointerException: null

異常堆棧丟了。Xit28資訊網——每日最新資訊28at.com

分析

在之前的一篇文章里已經驗證過這種寫法是可以正常打印異常和堆棧信息的:AI 自動補全的這句日志能正常打印嗎?Xit28資訊網——每日最新資訊28at.com

再三確認代碼寫法沒問題,納悶之下只好搜索了一下關鍵詞「Java異常堆棧丟失」,發現了這篇文章:Java異常堆棧丟失的現象及解決方法,這里面提到的問題與我們遇到的一樣,而且給出了 Oracle 官方文檔里的相關說明:Xit28資訊網——每日最新資訊28at.com

https://www.oracle.com/java/technologies/javase/release-notes-introduction.htmlXit28資訊網——每日最新資訊28at.com

The compiler in the server VM now provides correct stack backtraces for all “cold” built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.Xit28資訊網——每日最新資訊28at.com

Xit28資訊網——每日最新資訊28at.com

大致意思就是說,為了提高性能,JVM 會針對一些內建異常進行優化,在這些異常被某方法多次拋出時,JVM 可能會重編譯該方法,這時候就可能會使用不提供堆棧信息的預分配異常。如果想要完全禁用預分配異常,可以使用 -XX:-OmitStackTraceInFastThrow 參數。Xit28資訊網——每日最新資訊28at.com

了解到這個信息后,翻了翻從服務上次發版以來的這條日志,果然最早的十幾次打印是有異常堆棧的,后面就沒有了。Xit28資訊網——每日最新資訊28at.com

解決方案

回溯歷史日志,找到正常打印的堆棧信息,定位和解決問題;Xit28資訊網——每日最新資訊28at.com

也可以考慮在 JVM 參數里加上 -XX:-OmitStackTraceInFastThrow 參數,禁用優化;Xit28資訊網——每日最新資訊28at.com

本地復現

在本地寫一個簡單的程序復現一下:Xit28資訊網——每日最新資訊28at.com

public class StackTraceInFastThrowDemo {    public static void main(String[] args) {        int count = 0;        boolean flag = true;        while (flag) {            try {                count++;                npeTest(null);            } catch (Exception e) {                int stackTraceLength = e.getStackTrace().length;                System.out.printf("count: %d, stacktrace length: %d%n", count, stackTraceLength);                if (stackTraceLength == 0) {                    flag = false;                }            }        }    }    public static void npeTest(Integer i) {        System.out.println(i.toString());    }}

不添加 -XX:-OmitStackTraceInFastThrow 作為 JVM 參數時,運行結果如下:Xit28資訊網——每日最新資訊28at.com

...count: 5783, stacktrace length: 2count: 5784, stacktrace length: 2count: 5785, stacktrace length: 0Process finished with exit code 0

在我本機一般運行五六千次后,會出現異常堆棧丟失的情況。Xit28資訊網——每日最新資訊28at.com

添加 -XX:-OmitStackTraceInFastThrow 作為 JVM 參數時,運行結果如下:Xit28資訊網——每日最新資訊28at.com

...count: 3146938, stacktrace length: 2count: 3146939, stacktrace length: 2count: 3146940, stacktrace length: Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

運行了幾百萬次也不會出現異常堆棧丟失的情況,手動終止程序。Xit28資訊網——每日最新資訊28at.com

完整源碼見:https://github.com/mzlogin/java-notes/blob/master/src/org/mazhuang/StackTraceInFastThrowDemo.javaXit28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-10425-0.html解決 Java 打印日志吞異常堆棧的問題

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python中30個常見的內置函數使用講解(一)

下一篇: 【Python入門】為什么這門編程語言如此受歡迎?

標簽:
  • 熱門焦點
  • 石頭自清潔掃拖機器人G10S評測:多年黑科技集大成之作 懶人終極福音

    科技圈經常能看到一個詞叫“縫合怪”,用來形容那些把好多功能或者外觀結合在一起的產品,通常這樣的詞是貶義詞,但如果真的是產品縫合的好、縫合的實用的話,那它就成了中性詞,今
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • 量化指標是與非:挽救被量化指標扼殺的技術團隊

    作者 | 劉新翠整理 | 徐杰承本文整理自快狗打車技術總監劉新翠在WOT2023大會上的主題分享,更多精彩內容及現場PPT,請關注51CTO技術棧公眾號,發消息【WOT2023PPT】即可直接領取
  • 2納米決戰2025

    集微網報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
  • 三星獲批量產iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續在今年9月舉辦一年一度的秋季新品發布會,有傳言稱發布會將于9月12日舉行,屆時全新的iPhone 15系列將正式與大家見面,不出意外的話
  • OPPO K11評測:旗艦級IMX890加持 2000元檔最強影像手機

    【Techweb評測】中端機型用戶群體巨大,占了中國目前手機市場的大頭,一直以來都是各手機品牌的“必爭之地”,其中OPPO K系列機型一直以來都以高品質、
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風扇版本

    據10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風扇版本。另外,這款顯卡 PCB
Top