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

一篇学习Java排错技巧的文章

时间:2023-03-14 11:40:00 科技观察

本文转载自微信公众号《捉虫大师》,作者是捉虫大师。转载本文请联系捕虫大师公众号。前言最近翻了翻之前写的PPT,发现了一篇2019年做的技术分享,关于Java问题排查,既然完全没有公司机密,那我就整理出来分享给大家~直接贴吧在线问题处理流程PPT截图。现在看来,还不算过时。排错可以从三个方面的知识入手:一些问题,想一想就能找到答案,就像传说中的多龙一样,第83行代码就知道有问题了~工具:当然不是每个人都有它有可能过目不忘,也有可能代码根本不是你写的。这时候就需要依靠工具来定位问题数据:程序运行时产生的数据也可以提供很多线索。知识有很多方面,这里简单罗列一下:语言(本文特指Java):如JVM知识、多线程知识等框架:如Dubbo、Spring等组件:如Mysql,RocketMq等其他:比如网络,操作系统等。比如我们要了解Java对象从application被回收的整个过程,这张图很清楚,建议熟悉一下:那么也了解常见的垃圾收集器:吞吐量=单位时间内处理的请求数=运行代码时间/(运行代码时间+垃圾收集时间)以ParNew+CMS为例,尝试回答以下问题:为什么要分代收集?-关键词:高效对象什么时候进入老年?-关键字:age,sizeYoungGC和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,所以2T1jstack.txt最后,这篇文章是2019年12月首次分享的,也就是两年前的事了,因为是PPT编译的,所以文笔没有那么丝滑,但是排错的思路和方法还是一样的。你学会了吗?