zoukankan      html  css  js  c++  java
  • Log4j2:MDC踩坑记录之OutOfMemoryError

    为了更好的追踪日志,我在项目里使用了Log4j2的MDC功能,大概的用法如下,这个用法是错误的

    try {
        logger.info("开始处理 task:{}", task);
        ThreadContext.put("traceId", task.getKey());
        //实际业务
    }finally {
        ThreadContext.remove("traceId");
    }
    

    我的理解MDC是基于ThreadLocal实现的,所以用完后要remove掉,上线后跑了一天一夜,结果OOM了。

    因为最近没啥改动,就是上了这个功能,所以第一印象就是加了MDC导致的内存溢出。

    jmap -histo [pid] ****看了一下内存情况,没有特别异常的类,只是[C占用的内存特别高,基本可以肯定就是ThreadContext的字符串没有释放掉导致的问题。

    直接看ThreadContext源码,源码上有文档地址,https://logging.apache.org/log4j/2.x/manual/thread-context.html

    官方文档提供了两个例子

    1.使用CloseableThreadContext,它里面的Instance继承了AutoCloseable,会在结束时,自动关闭清理

    @Override
    public void close() {
        closeStack();
        closeMap();
    }
    

    2.在使用结束后调用ThreadContext.clear();方法进行删除

    在代码中是找不到.clear()方法的,但是有些类似的方法,比如clearStack(),clearMap(),clearAll()

    如果没有特殊要求,直接调用clearAll()就行

    public static void clearAll() {
        clearMap();
        clearStack();
    }
    

    最后代码改成

    try {
        logger.info("开始处理 task:{}", task);
        ThreadContext.put("traceId", task.getKey());
        //实际业务
    }finally {
        ThreadContext.clearAll();
    }
    

    一点毛病都没有啊,老铁们!!!

  • 相关阅读:
    Javascript错误调试与处理
    大话数据结构笔记——第七章 图
    大话数据结构笔记——第六章 树
    前端常见面试题(三)垂直居中的10种方式
    优化transform在过渡效果中出现文字模糊和抖动问题
    H-ui 管理系统
    thinkphp第一节结构
    php实现验证码
    fullpage.js
    jquery的使用
  • 原文地址:https://www.cnblogs.com/inkyi/p/15076252.html
Copyright © 2011-2022 走看看