之前一段时间,为我们发现的一个SaaS应用程序会间歇性地卡顿、变慢,因为很长时间都没有定位到原因,所以解决的办法就只能是重启。

这个现象和之前我们遇到的程序变得卡顿不太一样,因为我们发现这个应用程序不仅在高流量期间时会变慢,有时在低流量时期也会变慢。所以这令大家都很奇怪。

这类应用程序的变慢,重新启动之后就可以维持一段时间,但是过段时间又有可能会再次出现。

故障排除

当我们准备排查这个问题的时候,我们在应用程序速度很慢的时候,尝试着捕获了这个应用程序的线程Dump。有很多种方式来捕获线程转Dump,我们选择了“jstack”工具来获取。

在问题发生时获得线程Dump是非常关键的!

然后我们将捕获的线程Dump上传到一个线上线程Dump分析工具(https://fastthread.io/)。该工具立即帮我们生成了一份报告。

报告立即找出了问题的根本原因。分析工具上显示“http-nio-8080-exec-121”线程阻塞了100多个线程。下面是传递依赖图,展示了阻塞线程:

从图中可以看到100多个线程被“http-nio-8080-exec-121”线程阻塞。当我们点击图中的“http-nio-8080-exec-121”超链接时,它会打印出线程的堆栈轨迹:

仔细观察图中被框出来的部分,你可以看到该线程已经获取到org.apache.log4j.Logger的锁,正在进行其他的操作。

接下来,我们随便找一个被"http-nio-8080-exec-121"阻塞的线程,看一下他的堆栈信息:

看一下上面堆栈跟踪中被框出来的部分。我们可以看到“http-nio-8080-exec-56”当前正处于阻塞(BLOCKED)状态,而阻塞的原因是它正在等待获取org.apache.log4j.Logger的锁。

前面我们刚刚分析过,“http-nio-8080-exec-121”获得了org.apache.log4j.Logger的锁,正在进行其他操作,而锁并没有被释放,所以其他线程想要获得锁就只能被阻塞。

其余的所有被阻塞的线程也在等待获取org.apache.log4j.Logger的锁。因此,每当任何应用程序线程试图记录日志时,它都会因为无法获取到锁而进入阻塞状态。

刚开始我们也没有太多的头绪,后来我们尝试借助Google的力量,然后我们用谷歌搜索了"org.apache.log4j.Logger 阻塞 线程"这样的关键字。

我们在Apache Log4j bug数据库中偶然发现了这个有趣的Bug,而且这个Bug早在2015年就被发现了。(https://bz.apache.org/bugzilla/show_bug.cgi?id=57714 )。

这是Log4J框架中已知的bug之一,也是开发新的Log4j2框架的主要原因之一。

由于这个bug,任何试图打印日志的线程都进入了阻塞状态。它导致整个应用程序嘎然而止。一旦应用程序从Log4j迁移到Log4j2框架,问题就解决了。

结论

Log4j已经在2015年8月开始就不再被维护了。如果您的应用程序仍在使用Log4J框架,强烈建议升级到Log4j2框架。Log4j2不仅仅是Log4j框架的下一个版本,它是一个从零开始编写的新框架,它有很多性能改进。

最后,如果网站遇到程序被拖慢的问题,那么也可以考虑一下这个因素。

关于作者漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。


往期推荐

京东热 key 探测框架新版发布,单机 QPS 可达 35 万

Docker真的被禁止使用了?

《Java开发手册》解读:大整数传输为何禁用Long类型?

本文由“壹伴编辑器”提供技术支

直面Java第329期:哪个命令可以监控虚拟机各种运行状态信息?

深入并发第013期:拓展synchronized——锁优化

如果你喜欢本文,

请长按二维码,关注 Hollis.

转发至朋友圈,是对我最大的支持。

点个 在看 

喜欢是一种感觉

在看是一种支持

↘↘↘

老板:再用Log4j就收拾东西回家吧!相关推荐

  1. 企业管理 为什么老板再难,也不会放弃?而员工做得不顺,就想逃走?

    为什么一个老板再难,也不会轻言放弃?而一个员工做得不顺就想逃走? 为什么一对夫妻再吵再大矛盾,也不会轻易离婚?而一对情侣常为一些很小的事就分开了? 说到底,你在一件事,一段关系上的投入多少,决定你能承 ...

  2. access month函数用法_学会了这7个EXCEL日期函数技巧,老板再让你加班,你找我!...

    日期函数,常用年月日,时分秒,星期,季度,求差值等,学会以下几个函数,老板再让你加班,你找我! 1.记录当前时间(不随系统时间变化) NOW()函数与数据有效性结合,记录当前时间,就是这么简单! 2. ...

  3. 面对困难,你可以等死,也可以马上动手解决问题,解决完一个,就再解决一个,然后就可以回家了。...

    面对困难,你可以等死,也可以马上动手解决问题,解决完一个,就再解决一个,然后就可以回家了. 转载于:https://www.cnblogs.com/nana-tech/p/5943931.html

  4. java定义商品金额_老大说:谁要再用double定义商品金额,就自己收拾东西走

    先看现象 涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子: 典型现象(一):条件判断超预期 System.out.print ...

  5. double 乘法_老大说:谁要再用double定义商品金额,就自己收拾东西走 | 文末福利...

    来源:CodeSheep 先看现象 涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子: 典型现象(一):条件判断超预期 Sys ...

  6. 老大说:谁要再用double定义商品金额,就自己收拾东西走

    先看现象 涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子: 典型现象(一):条件判断超预期 System.out.print ...

  7. 什么是Docker?看这一篇干货文章就够了!

    作为程序员我们应怎样理解docker? 容器技术的起源 假设你们公司正在秘密研发下一个"今日头条"APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码 ...

  8. Spring Boot 2.3.3 稳定版发布!修复了这18个Bug!!

    8月13日,SpringBoot悄悄的升级了一个新的版本,2.3.3.RELEASE正式对外提供了. 在maven仓库中,已经支持对2.3.3.RELEASE的引用了. 这一版本中,新特性只有一个 ...

  9. 逼自己玩命学了3个多月,整理出了这份549个分支的技术脑图,分享给你

    出去面了一轮,投的[P6 Java资深开发工程师],整整2个小时都在聊技术,整个人被榨得一干二净,总觉得自己这几年已经挺 OK 了,但一轮面试下来,发现除了技术壁垒有待突破,更重要的是思维层面还要学很 ...

最新文章

  1. 3年编程经验无名校背景,全栈小哥是如何拿下Twitter Offer的?
  2. 使用Google Weather API查询天气预报
  3. 在未启动程序情况 点击视图设计器 弹出未将对象引用窗体的解决方案
  4. 前端学习(2183):tabber--基本架构的构建
  5. SQLServer DBA 三十问(加强版)
  6. python十条建议_十条建议帮你提高Python编程效率
  7. git 小乌龟 配置_Git-Bash和TortoiseGit小乌龟客户端配置记录
  8. vmware:Cannot open the disk 'XXX' or one of the snapshot disks it depends on.
  9. tyvj1194 划分大理石
  10. Android6.0之前版本(AwesomePlayer)OMXCodec执行流程细节
  11. 剑指Offer——二维数组中的查找
  12. WebToLayers如何将网页转换为PSD文档?
  13. adb ps shell 查看进程_Appium学废系列(三) adb调试桥命令
  14. ListView嵌套ScrollView后,设置dividerHeight属性后高度计算
  15. AutoJs学习-实现极乐净土
  16. 思科ccnp Mac地址漂移使用的场景
  17. css3动画Animate.css插件与wow.js插件
  18. 使用u盘如何装linux系统教程视频教程,如何使用u盘安装linux系统
  19. 基于PaddleX构建专属行车助手,为交通安全保驾护航
  20. tipask二次开发总结_tipask二次开发总结.docx

热门文章

  1. java正则表达式 ascii_Java——正则表达式
  2. 增量式pid调节方式有何优点_PID控制算法
  3. spi总线 上层调用_spi总线设备驱动分析
  4. 乐高无限无法连接到服务器,乐高无限近期热点问题FQ 新手问题解答
  5. java 多线程日志_多线程 打印的日志出现重复行
  6. java中怎么删除多表连接_在Java中从多个列表中合并和删除重复的最佳方式
  7. 删除链表的中间节点 Java实现_【链表问题】删除单链表的中间节点
  8. WebSocket简单使用
  9. 计组之中央处理器:5、微程序控制器(组成、原理、概念对比)
  10. 《论文笔记》ROBUST MAP ALIGNMENT FOR COOPERATIVE VISUAL SLAM