最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java異常堆棧打印次數(shù)限制機(jī)制用法詳解

 更新時(shí)間:2025年04月02日 09:11:09   作者:碼農(nóng)阿豪@新空間  
在Java開發(fā)中,異常處理是保證程序健壯性的重要手段,但當(dāng)同一個(gè)異常被頻繁拋出時(shí),日志可能會(huì)被大量重復(fù)的堆棧信息淹沒,影響問(wèn)題排查效率,所以本文給大家介紹了Java異常堆棧打印次數(shù)限制機(jī)制的用法,需要的朋友可以參考下

引言

在Java開發(fā)中,異常處理是保證程序健壯性的重要手段。但當(dāng)同一個(gè)異常被頻繁拋出時(shí),日志可能會(huì)被大量重復(fù)的堆棧信息淹沒,影響問(wèn)題排查效率。JVM如何控制異常堆棧的打印次數(shù)?不同JDK版本有何差異?如何自定義限制? 本文將深入探討這些問(wèn)題,并結(jié)合代碼示例進(jìn)行驗(yàn)證。

1. 異常堆棧打印的背景

1.1 異常堆棧的作用

異常堆棧(Stack Trace)記錄了異常發(fā)生時(shí)的調(diào)用鏈,幫助開發(fā)者快速定位問(wèn)題。例如:

try {
    throw new RuntimeException("Test Error");
} catch (RuntimeException e) {
    e.printStackTrace(); // 打印堆棧
}

輸出:

java.lang.RuntimeException: Test Error
    at com.example.Test.main(Test.java:5)

1.2 重復(fù)異常的問(wèn)題

如果某個(gè)異常在循環(huán)或高頻調(diào)用中被多次拋出,日志可能被大量重復(fù)堆棧信息填滿:

for (int i = 0; i < 1000; i++) {
    try {
        throw new RuntimeException("Repeated Error");
    } catch (RuntimeException e) {
        e.printStackTrace();
    }
}

這會(huì)導(dǎo)致日志文件膨脹,甚至影響性能。

2. JVM對(duì)重復(fù)異常堆棧的限制

為了避免重復(fù)堆棧信息過(guò)多,JVM引入了異常堆棧打印次數(shù)限制機(jī)制。

2.1 JDK 1.8 的默認(rèn)行為

  • 默認(rèn)限制:100 次
    同一個(gè)異常(相同類型和消息)最多打印 100 次 完整堆棧,超過(guò)后僅輸出簡(jiǎn)略信息。
  • 控制參數(shù):sun.io.maxRepeatedThrowablesMessages(JDK 1.8)

驗(yàn)證代碼

public class JDK8ExceptionLimitTest {
    public static void main(String[] args) {
        for (int i = 1; i <= 150; i++) {
            try {
                throw new RuntimeException("Test Exception - " + i);
            } catch (RuntimeException e) {
                e.printStackTrace();
            }
        }
    }
}

輸出觀察:

  • 前 100 次:完整堆棧信息。
  • 第 101 次后:類似 [Repeated 100 times, original stack trace at ...] 的簡(jiǎn)略信息。

2.2 JDK 9+ 的默認(rèn)行為

  • 默認(rèn)限制:2 次(更嚴(yán)格,減少日志冗余)
  • 控制參數(shù):jdk.sun.io.maxRepeatedThrowablesMessages(JDK 9+)

驗(yàn)證代碼

public class JDK9ExceptionLimitTest {
    public static void main(String[] args) {
        System.setProperty("jdk.sun.io.maxRepeatedThrowablesMessages", "2");
        for (int i = 1; i <= 5; i++) {
            try {
                throw new RuntimeException("JDK9 Test Exception - " + i);
            } catch (RuntimeException e) {
                e.printStackTrace();
            }
        }
    }
}

輸出觀察:

  • 前 2 次:完整堆棧。
  • 第 3 次后:簡(jiǎn)略信息。

3. 如何自定義異常堆棧打印限制?

3.1 修改JVM參數(shù)

  • JDK 1.8:
java -Dsun.io.maxRepeatedThrowablesMessages=10 MyApp
  • JDK 9+:
java -Djdk.sun.io.maxRepeatedThrowablesMessages=10 MyApp

3.2 運(yùn)行時(shí)動(dòng)態(tài)調(diào)整

public class CustomExceptionLimit {
    public static void main(String[] args) {
        // JDK 1.8
        System.setProperty("sun.io.maxRepeatedThrowablesMessages", "5");
        
        // JDK 9+
        // System.setProperty("jdk.sun.io.maxRepeatedThrowablesMessages", "5");

        for (int i = 1; i <= 10; i++) {
            try {
                throw new RuntimeException("Custom Limit Test - " + i);
            } catch (RuntimeException e) {
                e.printStackTrace();
            }
        }
    }
}

輸出:

  • 前 5 次:完整堆棧。
  • 第 6 次后:簡(jiǎn)略信息。

4. 日志框架的優(yōu)化方案

雖然JVM提供了限制機(jī)制,但實(shí)際開發(fā)中更推薦使用日志框架(如Log4j、SLF4J)管理異常日志,它們提供更靈活的重復(fù)日志抑制策略。

4.1 Log4j 2 的重復(fù)日志抑制

<Configuration>
    <Loggers>
        <Logger name="com.example" level="error">
            <Filters>
                <!-- 抑制相同異常連續(xù)打印超過(guò)3次 -->
                <DuplicateFilter timeout="5" level="warn"/>
            </Filters>
        </Logger>
    </Loggers>
</Configuration>

4.2 SLF4J + Logback 配置

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.DuplicateMessageFilter">
            <allowedRepetitions>2</allowedRepetitions> <!-- 允許重復(fù)2次 -->
        </filter>
    </appender>
</configuration>

5. 總結(jié)與最佳實(shí)踐

項(xiàng)目JDK 1.8JDK 9+
默認(rèn)限制100 次2 次
控制參數(shù)sun.io.maxRepeatedThrowablesMessagesjdk.sun.io.maxRepeatedThrowablesMessages
推薦調(diào)整根據(jù)業(yè)務(wù)需求調(diào)整(如 -Dsun.io.maxRepeatedThrowablesMessages=20可適當(dāng)放寬(如 -Djdk.sun.io.maxRepeatedThrowablesMessages=5

最佳實(shí)踐建議

  • 生產(chǎn)環(huán)境推薦限制在 5-20 次,避免日志過(guò)大但保留足夠調(diào)試信息。
  • 結(jié)合日志框架(如Log4j、Logback)管理異常日志,提供更精細(xì)控制。
  • 監(jiān)控高頻異常,優(yōu)化代碼避免重復(fù)異常拋出。

結(jié)語(yǔ)

Java的異常堆棧打印限制機(jī)制有效減少了日志冗余,但不同JDK版本行為不同。開發(fā)者應(yīng)結(jié)合JVM參數(shù)和日志框架,合理管理異常日志,提升系統(tǒng)可維護(hù)性。希望本文能幫助你更好地理解和優(yōu)化Java異常日志!

以上就是Java異常堆棧打印次數(shù)限制機(jī)制用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Java堆棧打印次數(shù)限制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java對(duì)接支付寶支付接口簡(jiǎn)單步驟記錄

    java對(duì)接支付寶支付接口簡(jiǎn)單步驟記錄

    最近項(xiàng)目APP需要接入微信、支付寶支付功能,在分配開發(fā)任務(wù)時(shí),聽說(shuō)微信支付接口比支付寶支付接口要難實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于java對(duì)接支付寶支付接口的簡(jiǎn)單步驟,需要的朋友可以參考下
    2024-05-05
  • Spring Boot條件化 Bean 注冊(cè)機(jī)制實(shí)戰(zhàn)案例解析

    Spring Boot條件化 Bean 注冊(cè)機(jī)制實(shí)戰(zhàn)案例解析

    本文將系統(tǒng)性地剖析 Spring 條件化注冊(cè)的核心原理、常用注解、自定義條件實(shí)現(xiàn)方式,并結(jié)合實(shí)戰(zhàn)案例展示其在數(shù)據(jù)庫(kù)切換、功能開關(guān)、多數(shù)據(jù)源、Starter 開發(fā)等場(chǎng)景中的高級(jí)應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java實(shí)現(xiàn)數(shù)據(jù)庫(kù)圖片上傳與存儲(chǔ)功能

    Java實(shí)現(xiàn)數(shù)據(jù)庫(kù)圖片上傳與存儲(chǔ)功能

    在現(xiàn)代的Web開發(fā)中,上傳圖片并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中是常見的需求之一,本文將介紹如何通過(guò)Java實(shí)現(xiàn)圖片上傳,存儲(chǔ)到數(shù)據(jù)庫(kù)的完整過(guò)程,希望對(duì)大家有所幫助
    2025-03-03
  • Springboot利用Aop捕捉注解實(shí)現(xiàn)業(yè)務(wù)異步執(zhí)行

    Springboot利用Aop捕捉注解實(shí)現(xiàn)業(yè)務(wù)異步執(zhí)行

    在開發(fā)過(guò)程中,盡量會(huì)將比較耗時(shí)且并不會(huì)影響請(qǐng)求的響應(yīng)結(jié)果的業(yè)務(wù)放在異步線程池中進(jìn)行處理,那么到時(shí)什么任務(wù)在執(zhí)行的時(shí)候會(huì)創(chuàng)建單獨(dú)的線程進(jìn)行處理呢?這篇文章主要介紹了Springboot利用Aop捕捉注解實(shí)現(xiàn)業(yè)務(wù)異步執(zhí)行
    2023-04-04
  • Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則

    Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則

    這篇文章主要介紹了Java 重寫時(shí)應(yīng)當(dāng)遵守的 11 條規(guī)則,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot實(shí)現(xiàn)根據(jù)手機(jī)號(hào)獲取歸屬地

    SpringBoot實(shí)現(xiàn)根據(jù)手機(jī)號(hào)獲取歸屬地

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何實(shí)現(xiàn)根據(jù)手機(jī)號(hào)獲取歸屬地,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • java執(zhí)行shell命令及日志收集避坑指南分享

    java執(zhí)行shell命令及日志收集避坑指南分享

    這篇文章主要介紹了java執(zhí)行shell命令及日志收集避坑指南,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • spring?boot自帶的page分頁(yè)問(wèn)題

    spring?boot自帶的page分頁(yè)問(wèn)題

    這篇文章主要介紹了spring?boot自帶的page分頁(yè)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 一文詳解Maven繼承之構(gòu)建高效項(xiàng)目結(jié)構(gòu)的利器

    一文詳解Maven繼承之構(gòu)建高效項(xiàng)目結(jié)構(gòu)的利器

    Maven 是一個(gè)強(qiáng)大的項(xiàng)目管理工具,它通過(guò)標(biāo)準(zhǔn)化的項(xiàng)目結(jié)構(gòu)和依賴管理極大地簡(jiǎn)化了 Java 項(xiàng)目的開發(fā)流程,本文將詳細(xì)介紹 Maven 繼承的概念,并提供一個(gè)通俗易懂的例子來(lái)幫助大家更好地理解和應(yīng)用這一功能
    2025-07-07
  • Java switch 語(yǔ)句如何使用 String 參數(shù)

    Java switch 語(yǔ)句如何使用 String 參數(shù)

    這篇文章主要介紹了Java switch 語(yǔ)句如何使用 String 參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

六盘水市| 五常市| 夏邑县| 集安市| 雷波县| 潼南县| 台东市| 江都市| 秦皇岛市| 泾源县| 故城县| 芜湖市| 大名县| 绥德县| 务川| 大悟县| 棋牌| 灵宝市| 出国| 普兰店市| 塔城市| 南城县| 成都市| 河北区| 瑞安市| 大渡口区| 永和县| 太湖县| 汝州市| 大新县| 麟游县| 沙田区| 太谷县| 建湖县| 敖汉旗| 北辰区| 潮安县| 昆明市| 武安市| 嵊州市| 宁南县|