-
Notifications
You must be signed in to change notification settings - Fork 10
JavaPerformance
mythos edited this page Jul 21, 2018
·
6 revisions
目录 start
目录 end |2018-07-13| 码云 | CSDN | OSChina
JDK 自带的工具
Memory Analyzer tool(MAT) 官网
- 表象
- 使用Tomcat进行部署的, 然后机器上两个Tomcat都僵死了, 进程还在, 但已经不能提供服务了, 日志也停止了记录
- 分析
- 由于第一次遇到这种情况, 没有把现场保留, 直接就重启Tomcat了, 然后老大经过分析 一个堆栈快照文件(?), 发现有几个对象大量存在, 没有被GC
- 然后启动本地Tomcat, 用 jvisualvm 进行调试, 发现有几个类的实例一直无法释放,
- 初步 分析这几个类的 生命周期 , 以为是项目中使用的缓存, 没有好好清理, 又因为项目中缓存种类比较多, 调试分析了比较久
- 最后是老大, 看到有个注册定时任务的地方, 当中的代码有比较严重的 隐患
- 原因
- 在一个方法中调用了一个异步的定时任务, 并且声明了一个final 变量 给这个任务操作, 并且任务中的代码没有做好安全防护(try catch), 直接就一溜写下去
- 这里就存在一个隐患了, 如果任务执行失败抛出异常 主线程并不能收到错误提示, 后面的资源回收就无法执行, 然后该任务在定时的报错, 自己和所持有的final 变量也无法释放
- 主线程也不知情.......
- 结论
- final 使用时, 要考虑为什么要用,
- 如果是有了异步的行为, 就要将异步中的代码好好审视, 不能没有忽视代码所有可能的异常
- Introduction
- ApiAndDoc
- Platform
- Process
- Repository
- SUMMARY
- Website
- 【 Article 】
- 【 Blog 】
- 【 Database 】
- 【 FrontEnd 】
- 【 FrontEnd/Frame 】
- 【 FrontEnd/Node 】
- Hexo
- JavaScript
- LearnPS
- ResponseCode
- ViewSolution
- 【 Functional 】
- 【 Go 】
- 【 Java 】
- 【 Java/AdvancedLearning 】
- 【 Java/Framework 】
- 【 Java/MSA 】
- 【 Java/Spring 】
- 【 Java/TemplateEngine 】
- 【 Java/Tool 】
- AlibabaJavaStandard
- EE
- JavaSE
- Log
- MIS
- RESTful
- ZenOfPattern
- 【 Linux 】
- 【 Linux/Alpine 】
- 【 Linux/Arch 】
- 【 Linux/Base 】
- 【 Linux/Centos 】
- 【 Linux/Container 】
- 【 Linux/Debian 】
- 【 Linux/Tool 】
- 【 Linux/Vcs 】
- JavaDevInit
- 【 MyBlog 】
- 【 MyBlog/Problem 】
- 2018-3-15-install-deepin
- why-put-netty-in-tomcat
- 【 Python 】
- 【 Reactive 】
- 【 Script 】
- 【 Skills 】
- 【 Skills/CS 】
- 【 Skills/Document 】
- 【 Skills/Ecology 】
- 【 Skills/FrameWork 】
- 【 Skills/Soft 】
- 【 Skills/Spider 】
- 【 Skills/Test 】
- 【 Skills/Work 】
- AppManual
- CelebrityQuotes
- CodingThinking
- Problem
- RegularExpression
- SoftwareDesignEngineer
- 【 Windows 】