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
Log4j Bug –减慢您的应用程序相关推荐
- 微信翻译出Bug上热搜,程序员又背锅?
作者| 伍杏玲 来源 | 程序人生(ID:coder_life) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_source=cxrs_ ...
- log4j 程序日志_Log4j错误–减慢您的应用程序
log4j 程序日志 最近,我们正在对流行的SaaS应用程序进行故障排除. 该应用程序间歇性地变慢. 要从问题中恢复,必须重新启动应用程序. 在高流量期间,此应用有时会变慢. 有时在交通繁忙时也是如此 ...
- 微信翻译生日快乐的代码_微信翻译出 Bug 上热搜,程序员又背锅?!
天撸了!昨天微信翻译因为出Bug被网友送上热搜,网友质疑微信在翻译明星内容时,结果是近乎"恶搞". 当输入:"you play basketball like caixu ...
- 在Tomcat 与weblogic 中的 日志(log4j) 配置系列二(weblogic 应用程序使用log4j)
前言 在Tomcat 与weblogic 中的 日志(log4j) 配置系列一 在系列一 中, 有一个问题一直没有解决,就是部署到weblogic 中应用程序如何通过log4j写日志到文件中? 这里仅 ...
- 微信翻译出 Bug 上热搜,程序员又背锅?!
天撸了!昨天微信翻译因为出Bug被网友送上热搜,网友质疑微信在翻译明星内容时,结果是近乎"恶搞". 当输入:"you play basketball like caixu ...
- 软件测试:用“bug”来表示“在电脑程序里的错误”
计算机基础知识 计算机(personal computer)俗称电脑(pc),是现代一种用于高速计算的电子机器,可以进行数值计算,又可以进行逻辑判断,还具有存储记忆功能,且能够按照程序的运行,自动.高 ...
- uniapp动态显示数组_【报Bug】uniapp 在小程序中 动态修改添加 数组 数据 ,点击获取的索引值错误...
在微信小程序中会有这个问题,h5正常 在 v-for数组列表 同时 :key 值没有用下标设置,而是用其它设置 ,会导致 动态添加数组内容 ,点击列表 获取的 列表下标 错误 重现步骤 {{title ...
- 【本人秃顶程序员】求求你别再写 bug 了,秃顶程序员告诉你避免空指针的 5 个案例!
←←←←←←←←←←←← 快!点关注 空指针是我们 Java 开发人员经常遇到的一个基本异常,这是一个极其普遍但似乎又无法根治的问题. 本文,栈长将带你了解什么是空指针,还有如何有效的避免空指针. 什 ...
- 日常BUG总结:另一个程序已锁定文件的一部分,进程无法访问 打不开磁盘
晚上电脑自行关机,第二天再次开机,打开VMware,出现如下错误: 另一个程序已锁定文件的一部分,进程无法访问 打不开磁盘"E:\Ubuntu\Ubuntu 64 位.vmdk"或 ...
最新文章
- lvs服务器需要开启web服务么_如何检测 Web 服务请求丢失问题
- 从一次react异步setState引发的思考
- 人月神话阅读笔记02
- 2.4-虚拟磁盘恢复虚拟机
- Docker网络和服务发现
- flask框架创建数据库定义字段类型和字段常用参数
- 把一张合成图分拆出各个小图
- 1106 Lowest Price in Supply Chain(甲级)
- pycharm和pythonIDE安装详解
- vue——vuex mapState,mapGetters,mapMutations,mapActions
- CoffeeScript简介 二
- 应对亚洲劳动力成本不断上升的挑战
- markdown 本地链接_markdown多平台发布及七牛图床使用
- Vue学习笔记(四)
- Request 获取网址各片段
- 怎么样测试需要登录的接口?需要登录的接口怎么测试性能?
- 《人月神话》之外科手术队伍
- X265代码学习1-X265源码下载编译及VS调试配置
- 23Bootstrap
- 自己实现SDIO wifi Marvell8801/Marvell88w8801驱动 介绍(一) ---- 芯片介绍
热门文章
- M. Monster Hunter(树形dp)
- SoundHound Inc. Programming Contest 2018[C. Ordinary Beauty]
- 练习利用LSTM实现手写数字分类任务
- JavaFX UI控件教程(四)之Button
- JAVA面试常考系列三
- Git操作常用的命令都在这里了
- (九)Spring 事务开发、事务属性详解
- 第六章连接和分组查询
- mysql---批量插入数据:100w条数据
- 可视化大屏设计尺寸_可视化大屏设计_酷炫不是最高效的大屏展示的唯一标准...