老哥,你遇到过log4j2线程阻塞的场景吗?

admin 2025-09-14 阅读:48 评论:0
https://www.cnblogs.com/yeyang/p/10400486.html 在使用log4j2打日志时,当发生大量异常时,造成大量线程block问题的问题。 # 大量线程block原因 发生异常,打印异常栈时,会调用 or...

https://www.cnblogs.com/yeyang/p/10400486.html

在使用log4j2打日志时,当发生大量异常时,造成大量线程block问题的问题。

# 大量线程block原因

发生异常,打印异常栈时,会调用

org.apache.logging.log4j.core.impl.ThrowableProxy.toExtendedStackTrace方法。

log4j一个日志被覆盖_ThrowableProxy.toExtendedStackTrace类加载问题_log4j2线程block异常处理

log4j一个日志被覆盖_ThrowableProxy.toExtendedStackTrace类加载问题_log4j2线程block异常处理

log4j2线程block异常处理_ThrowableProxy.toExtendedStackTrace类加载问题_log4j一个日志被覆盖

ThrowableProxy.toExtendedStackTrace类加载问题_log4j一个日志被覆盖_log4j2线程block异常处理

ThrowableProxy.toExtendedStackTrace内部会进行loadClass操作。

并且可以看到ClassLoader的loadClass在加载类时

1.首先会持有锁。

2.调用findLoadedClass看下是否类已经被加载过了

3.如果类没被加载过,根据双亲委派模型去加载类。

可以看到当某个类被加载过了whatsapp登录,调用findLoadedClass会直接返回,锁也会被很快释放掉,无需经过双亲委派等后面的一系列步骤。

但是whatsapp web,在进行反射调用时,JVM会进行优化,会动态生成名为

sun.reflect.GeneratedMethodAccessor的类,这个类无法通过ClassLoader.loadClass方法加载(为什么无法通过ClassLoader.loadClass加载?因为JVM内部自定义一个加载器DelegatingClassLoader来加载这个类whatsapp官网,这导致应用类加载器 Launcher$AppClassLoader找不到它)。

导致每次解析异常栈进行类加载时,锁占有的时间很长,最终导致阻塞。

# 关于JVM对反射调用的优化

Java中对反射的优化

使用反射调用某个类的方法,jvm内部有两种方式

1.JNI:使用native方法进行反射操作。

2.pure-Java:生成bytecode进行反射操作,即生成类

sun.reflect.GeneratedMethodAccessor,它是一个被反射调用方法的包装类,代理不同的方法,类后缀序号会递增。这种方式第一次调用速度较慢,较之第一种会慢3-4倍,但是多次调用后速度会提升20倍

对于使用JNI的方式,因为每次都要调用native方法再返回,速度会比较慢。所以,当一个方法被反射调用的次数超过一定次数(默认15次)时,JVM内部会进行优化,使用第2种方法,来加快运行速度。

JVM有两个参数来控制这种优化

-Dsun.reflect.inflationThreshold= value默认为15,即反射调用某个方法15次后,会由JNI的方式变为pure-java的方式

-Dsun.reflect.noInflation=true

默认为false。当设置为true时,表示在第一次反射调用时,就转为pure-java的方式

下面是一个验证反射优化的样例:

log4j2线程block异常处理_ThrowableProxy.toExtendedStackTrace类加载问题_log4j一个日志被覆盖

配置如下JVM参数,使得在第一次反射调用时,就转为pure-java的方式

ThrowableProxy.toExtendedStackTrace类加载问题_log4j一个日志被覆盖_log4j2线程block异常处理

打断点跟踪:

log4j一个日志被覆盖_ThrowableProxy.toExtendedStackTrace类加载问题_log4j2线程block异常处理

log4j2线程block异常处理_ThrowableProxy.toExtendedStackTrace类加载问题_log4j一个日志被覆盖

ThrowableProxy.toExtendedStackTrace类加载问题_log4j一个日志被覆盖_log4j2线程block异常处理

ThrowableProxy.toExtendedStackTrace类加载问题_log4j一个日志被覆盖_log4j2线程block异常处理

可以看到GeneratedMethodAccessor1的classLoader为DelegatingClassLoader,其parent为AppClassLoader。

ThrowableProxy.toExtendedStackTrace类加载问题_log4j一个日志被覆盖_log4j2线程block异常处理

# 如何关闭JVM对反射调用的优化?

想关闭JVM对反射优化怎么办?

JVM中只提供了两个参数,因此,没有办法完全关闭反射优化。

一种能想到的接近于关闭反射优化的方法就是将inflationThreshold设为的一个特别大的数。

inflationThreshold是java中的int型值,可以考虑把其设置为Integer.MAX_VALUE ((2^31)-1)。

$ java-Dsun.reflect.inflationThreshold=2147483647MyApp

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

3502文章数 0评论数
热门文章
  • 详细指南:WhatsApp国内使用方法全攻略-下载安装、注册登录及功能使用攻略

    详细指南:WhatsApp国内使用方法全攻略-下载安装、注册登录及功能使用攻略
    一、下载与安装WhatsApp WhatsApp是一款全球使用范围极广的即时通讯软件,不仅可以实现文本聊天,还能进行语音、视频通话WhatsApp中文版,发送文件等功能。由于众所周知的原因,国内用户想要下载和安装WhatsApp可能会遇到一些困难。不过,只要按照以下步骤操作,就能顺利完成WhatsApp的下载和安装。 首先,我们需要解决的是下载问题。由于WhatsApp在国内的应用商店无法直接下载,所以我们需要寻找其他的下载途径。Android用户可以选择到各大安卓市场搜索下...
  • 苹果IOS5.1.1机完美越狱

    苹果IOS5.1.1机完美越狱
    越狱工具下载:(需手动复制: http://bbs./read-htm-tid-4804612.html ) 详细的越狱教程: Absinthe 2.0.4的越狱方法与Absinthe 1.0的越狱方法完全一样,非常简单的“傻瓜一键式”。不过这里绿毒有说明,最好重新刷固件。支持越狱设备IOS5.1.1的固件下载地址请点击本站的IOS固件下载,看下图: 下载完固件之后,把设备连接iTunes,开始刷固件。你也可以选择不刷,但是在越狱的过程之中,新的系统在越狱时会比较的顺利,...
  • 电脑微信的聊天照片文件在哪里微信图片保存电脑哪个文件夹

    电脑微信的聊天照片文件在哪里微信图片保存电脑哪个文件夹
    1. 怎么找到微信聊天图片在哪个文件夹里 图片保存路径:/storage/emulated/tencent/MicroMsg/WeiXin/文件夹,这个是完整路径。而在文件夹中只需要找到/tencent/MicroMsg/WeiXinWhatsApp中文版,就可以了,前面两个文件夹是系统根目录。以下是保存及查找图片的方法步骤介绍。 第一步、找到桌面的微信APP,直接点击打开这个微信的APP。 2. 电脑微信图片保存在哪个文件夹 个人微信文件夹。 电脑版微信聊天的图片,都保存到...
  • Windows 11版WhatsApp将从UWP/Native切换回WebView2打包模式

    Windows 11版WhatsApp将从UWP/Native切换回WebView2打包模式
    Meta(最近更名为 Meta AI)悄然宣布,WhatsApp 将在 Windows 11 上放弃 UWP(WinUI)WhatsApp中文版,退回采用基于 Chromium 的容器。这意味着 WhatsApp 又回到了几年前的样子。由于 web.whatsapp.com 一直领先于 Windows 应用开发,它确实拥有一些新功能,但速度更慢,占用更多内存。 如果独立开发者因为无力维护所有平台的代码库而选择 Web 应用程序,那是一回事,但当像 Meta 这样价值万亿美元...
  • 小米下載WhatsApp的完整指南:安装与使用注意事项

    小米下載WhatsApp的完整指南:安装与使用注意事项
    综上所述,确保您的小米手机具备以上条件,将有助于您顺利下载和安装WhatsApp,享受便捷的通讯服务。在满足这些条件后,您就可以按照后续步骤进行WhatsApp的下载和安装。 2. 下载和安装WhatsApp的具体步骤 在小米手机上下载和安装WhatsApp的具体步骤相对简单,但需注意一些特殊情况。首先,确保你的手机系统已更新到最新版本,以保证最佳的兼容性。由于安卓手机商店内无法直接找到WhatsApp,你可以通过APKPure等第三方应用商店进行下载。打开APKPure应用...