当前位置: 首页 > 科技观察

Java故障排查技术分享

时间:2023-03-17 23:13:45 科技观察

前言最近翻了一下之前写的PPT,发现一个2019年做的技术分享,关于Java故障排查,既然完全没有公司机密,我整理一下分享给大家~在线问题处理直接把PPT截图放在流程里吧。看来还是过时了。排错可以从三个方面的知识入手:一些问题,想一想就能找到答案,就像传说中的多龙一样,你就知道83行的代码有问题~工具:当然不是每个人都有可以过目不忘,也有可能代码根本不是你写的。这时候就需要依靠工具来定位问题数据了:程序运行时产生的数据也能提供很多线索,知识面很多,这里简单罗列一下:Language(本文具体参考toJava):如JVM知识、多线程知识等框架:如Dubbo、Spring等组件:如Mysql、RocketMq等其他:如网络、操作系统等例如,我们需要了解Java对象从申请到回收的全过程。这个图很清楚,建议熟悉一下:然后我们还要了解常见的垃圾收集器:吞吐量=单位时间内处理的请求数=运行代码时间/(运行代码时间+垃圾收集时间)取ParNew+以CMS为例,尝试回答以下问题:为什么需要分代采集?—关键词:效率对象什么时候进入老年?—关键字:年龄、大小YoungGC和FullGC什么时候发生?—关键词:Eden不足,Old不足,Meta不足,map/System.gc如果我们了解了以上知识,举一个实际的例子,当我们发现YoungGC频繁触发,耗时较长时,如何优化?首先想到,YoungGC什么时候触发?答案是Eden区不够用。接下来,YoungGC的主要耗时是什么?答案是扫描+复印,通常扫描快,复印慢。然后我们对症下药,尽量增加新生代的大小。结果真的解决了问题。为什么?我们再分析一下当新生代大小为M时,假设对象存活750ms,youngGC间隔为500ms,扫描时间为T1,复制时间为T2。当新生代大小为M时:频率为2次/s,每次需要T1+T2当新生代扩展到2M时:频率为1次/s,每次需要2T1。由于T2远大于T1,因此2T1