Log4j Bug –减慢您的应用程序

最近,我们正在对流行的SaaS应用程序进行故障排除。 该应用程序间歇性地减慢了速度。 要从问题中恢复,必须重新启动应用程序。 在高流量期间,此应用有时会变慢; 有时在交通繁忙时也是如此。 没有凝聚力模式。

这种应用程序变慢并重新启动它持续了一段时间。 然后,我们开始解决问题。 我们发现了一些有趣的东西,以为您也可以从我们的发现中受益,因此撰写了本文。

技术栈

这个流行的SaaS应用程序在Azure云上运行。 下面是它的技术堆栈:

+ Spring框架

+ GlassFish应用服务器

+ Java 8

+ Azure云

故障排除

得知此问题后,我们就在发生减速时从该应用程序捕获了线程转储。 有多种捕获线程转储的选项 ; 我们选择了“ jstack”工具来捕获线程转储。

注意:发生问题时,正确获取线程转储非常重要。 在问题持续时间窗口之外捕获的线程转储将无用。

现在,我们将捕获的线程转储上传到fastThread.io –在线线程转储分析工具。 该工具立即生成了此精美报告 。 (我们建议您单击超链接以查看生成的报告,以便获得第一手的经验)。

该报告立即缩小了问题的根本原因。 fastThread.io工具突出显示“ http-nio-8080-exec-121”线程正在阻止134个应用程序线程。 下面是传递依赖关系图,显示了已阻塞的线程:

图:fastThread.io显示了已阻塞线程的传递依赖关系

从该图可以看到134个应用程序线程被“ http-nio-8080-exec-121”线程阻塞(第一个从左侧开始)。 当我们单击图中的“ http-nio-8080-exec-121”超链接时,它会打印线程的堆栈跟踪:

图:http-nio-8080-exec-121获得的org.apache.log4j.Logger锁

我要求您仔细查看堆栈跟踪中突出显示的部分。 您可以看到线程获得org.apache.log4j.Logger锁,然后继续前进以将日志记录写入Azure云存储。

现在,让我们看一下“ http-nio-8080-exec-56”线程(134个被阻塞的线程之一)的堆栈跟踪:

图:http-nio-8080-exec-56等待获得org.apache.log4j.Logger锁

看一下上面堆栈跟踪中突出显示的部分。 它正在等待获取org.apache.log4j.Logger锁。 您可以看到'http-nio-8080-exec-56'线程处于BLOCKED状态,因为'http-nio-8080-exec-114'获得了org.apache.log4j.Logger锁并且没有释放它。

其余的134个线程也被卡住,等待'org.apache.log4j.Logger'锁。 因此,每当任何应用程序线程尝试登录时,它都会进入此BLOCKED状态。 因此134个应用程序线程结束进入此BLOCKED状态。

然后,我们用google搜索org.apache.log4j.Logger BLOCKED线程。 我们偶然发现了Apache Log4j错误数据库中报告的这个有趣的缺陷 。

事实证明,这是Log4J框架中的已知错误之一,也是开发新Log4j2框架的主要原因之一。 以下是该缺陷描述的有趣摘录:

没有针对此问题的临时修复程序,这是Log4j 2出现的原因之一。 唯一的解决方法是升级到Log4j 2。

是的,我是说Log4j 2中的代码有很大不同,并且锁定的处理方式也有很大不同。 根记录器或附加器循环上没有锁。

由于该错误,任何试图登录的线程都进入了“阻塞”状态。 这导致整个应用程序停止运行。 将应用程序从Log4j迁移到Log4j2框架后,问题得到解决。

结论

1. Log4j已于2015年8月达到停产(已停产)。不再受支持。 如果您的应用程序仍在使用Log4J框架,我们强烈建议您升级到Apache Log4j2框架。 这是迁移指南 。 Log4j2不仅仅是Log4j框架的下一版本; 这是一个从头开始编写的新框架。 它具有很多性能改进。

2.此外,现在您还可以学习如何对无响应的应用程序进行故障排除。

翻译自: https://www.javacodegeeks.com/2020/01/log4j-bug-slows-down-your-app.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

androidstudio --debug 出现 source code not match bytecode

问题 如标题 原因 编译api版本与运行app的模拟器api版本不一致 解决 换成API版本一致的模拟器运行app即可

android monitor突然不能显示

问题 如题 原因 不清楚。。。。 解决 方式一-有副作用(原因不明)-debug可能会一直 wait attach,不能进入调试模式 先将Android NDK support plugin禁用(重启androidstudio)右击android monitor,选择remove from …

jvm虚拟机 基于栈_守护基于JVM的应用程序

jvm虚拟机 基于栈部署体系结构设计是任何定制服务器端应用程序开发项目的重要组成部分。 由于其重要性,部署架构设计应尽早开始,并与其他开发活动一起进行。 部署体系结构设计的复杂性取决于许多方面,包括所提供服务的可伸缩性和可用性目标&a…

ListView中让TextView中的文字进行单独滚动

TextView不能在ListeView中单独的滚动原因 默认ListView将会拦截MOVE事件向下传递 参见源码 case MotionEvent.ACTION_MOVE: {switch (mTouchMode) {case TOUCH_MODE_DOWN:int pointerIndex ev.findPointerIndex(mActivePointerId);if (pointerIndex -1) {pointerIndex 0;…

JPA @Embeddable和@Embedded

介绍: 作为一个面向对象的开发人员,我们希望避免使用带有大量不相关字段的大型类。 因此,我们可能经常感到有必要使用多个对象来表示JPA实体。 在本快速教程中,我们将学习如何使用JPA或Hibernate中的Embedded和Embeddable注释来实…

android monitor不能查看/data目录

问题 在android 7.0虚拟机上不能查看/data目录 解决 1. 修改目录权限 开始->cmd->adb shell->chmod -R 777 /data 2. root虚拟机 先执行 adb root,再执行 adb remount 出现remount succeeded表示可以了

Sqlite error- INSERT failed: datatype mismatch

问题 sqlite3 使用.import命令导入输入出现error-INSERT failed: datatype mismatch 原因 文件字段的默认分隔符为“|”,而从excel转换的.csv文件默认为逗号,所以导致文件解析出错,进而 “数据类型不匹配” 解决 在.import命令前修改分隔…

反射-获取java私有内部类反射类型、私有字段

获取JAVA私有内部类反射类型 方式一 Class.forName(“外部类完整路径$内部私有类类名”); 方式二 通过获取对应私有内部类的字段而获取 完整的类名 Class.forName(field.getType().getName()) 获取JAVA私有字段 Class.forName(“类完整路径”).getDelcaredField(“字段名…

javafx透明边框_JavaFX技巧6:使用透明颜色

javafx透明边框为用户界面元素选择正确的颜色始终是一个很大的挑战,但是当您开发可重用的框架控件时,开发人员就无法控制使用它们的应用程序的外观和感觉,这甚至更具挑战性。 尽管您可能总是将元素添加到默认的灰色背景之上,但是嵌…

android-创建sdcard

进入sdk 安装路径 tools目录下 mksdcard 100M D:\dxfSDCard.img //创建一个100M的sdcard

Apache Ivy 2.5.0发布

本周,我们发布了Apache Ivy的 2.5.0版本。 Apache Ivy是与Apache Ant构建工具集成的构建依赖项管理器。 可以照常从https://ant.apache.org/ivy/download.cgi下载该下载。 该2.5.0版本是在Ivy发行版中存在很大差距之后发布的。 2.4.0于2014年12月26日发布。此后&am…

android: a system image must be selected to continmue

问题:如题 原因: 没有对应的镜像文件 解决 android studio 进入setting -> appearance behavior -> system setting -> android sdk 下载对应的镜像文件即可

win10 更新 英特尔显示器音频 后显示器音箱没有声音

问题 如题,win10系统更新后显示器音箱没有声音,且右击桌面声音查看播放设备 (说明:这是在解决问题之后截的图,没解决前,只有一个“扬声器/听筒”,原先是存在BenQ LCD的) 解决过…

unity ppr_智能自动PPR更改事件策略

unity pprADF开发人员普遍认为,将迭代器绑定更改事件策略设置为ppr在性能方面不是一件好事,因为此策略会强制框架刷新每个请求上绑定到此迭代器的所有属性绑定。 这不是真的! 框架仅刷新在请求期间已更改的属性和依赖于已更改属性的属性。 …

onenote创建快速笔记--此分区尚不可用,它是从其他设备添加的,该设备同步后才将可用

问题如题 解决 【文件】→【选项】->【保存和备份】 ->【修改】-> 选择新的分区存放快速笔记 图文并茂请参见:https://blog.sina.com.cn/s/blog_7012320d0102wsmw.html 其他: 同步不能连接服务器 解决该问题时,出现同步不成功&…

用Java匹配模式

如果您使用的是Java,那么您之前很有可能会看到其模式匹配。 String#matches(String)方法在内部使用Pattern类型,该类型包含更复杂的功能: 通过编译正则表达式来创建Pattern 。 该模式与任何输入字符串匹配,并且可以选择查找捕获组…

gradle-com.android.build.api.transform.TransformException:Error while generating the main dex list

问题 What went wrong: Execution failed for task >’:app:transformClassesWithMultidexlistForYm10000016Release’. com.android.build.api.transform.TransformException: Error while generating the main dex list. 原因 MultiDex未做初始化 解决 在application的…

Devc++- 源文件未编译”

问题:如题 解决: 删除D:\Software\DEV-CPP\Libexec\gcc\mingw32\3.4.2\目录中的collect2.exe(最好修改名称或备份一下)

如何构建一个Maven插件

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 由于其插件生态系统的普及,Apache Maven仍然是Java领域中最流行的构建工具。 很容易找到一个现有的插件来…

devc++ 运行时黑屏一闪而过

解决 return 0;前 写getchar();或者 system("pause");