您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
Java程序出错了,定位错误有哪些技巧?
错误,代码,日志Java程序出错了,定位错误有哪些技巧?
发布时间:2020-12-06加入收藏来源:互联网点击:
Java程序出错了,定位错误有哪些技巧?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
在开发、测试、线上运行的过程中,程序难免会出现问题,如果快速地定位程序的问题,是每个程序员的必修课。
01. 日志是基础
当程序报错,最简单且快速的方法就是查询日志中的报错信息了;所以我们在敲代码的时候,一定不能对 CheckedException 只捕捉不处理。
首先不要忽略异常,第一可以在捕捉到异常后将日志信息输出,要么通过 Throw 或 throws 向上抛,让上层的代码进行处理;
接上,不要捕捉异常后,输出完日志又向上抛出异常,这样当查询定位错误时,会产生误导;
对于捕捉到的异常,最好可以精确地指出具体是什么异常,而不要用 catch(Exception e) 替代;
如果选择了输出异常,那么就要把异常单独打印到一个日志文件中,否则你很可能需要在一大堆日志文件中翻阅查找;
另外,日志信息尽可能的详细,比如方法的入参、与其他系统交互的报文等等。
如果你能在日志文件中快速的找到报错信息的话,那么再定位错误程序就容易很多:
通常异常输出能看到报错的类、方法、甚至代码行数,可以先检查程序是不是有显而易见的错误;
如果是开发测试环境,可以通过 IDE 进行代码调试,如果错误每次都可以复现,那就是一个明显的 BUG,如果是部分数据有问题,那么就要分析是程序不严谨,还是数据有问题;
如果是生成环境的话,我们很难进行线上调试,那么只能通过日志来进行具体的分析了,条件允许的话,可以把生产环境的数据拿下来进行检查和调试。
02. 完善的监控
很多程序员会说,我的日志都很完善了,还需要监控么?我建议最好是有的,而且监控越完善越好。
首先,通过日志查询问题,通常都是业务人员或用户在操作过程中遇到问题,找到运维和开发之后,我们再去翻日志;如果有监控的话,可以实时地发现问题,提前解决问题。
第二,现在很多项目都不是单台部署,应用部署个几台、几十台甚至几百台都很常见,当发现问题之后,人肉翻日志已经不太现实了,如果有一个日志平台的话,那就会方便很多。
第三,很多公司的项目都是分布式架构、微服务架构,越来越多的服务都是链路调用,A系统调B系统,B系统再调C系统和D系统,这种情况下翻一个服务的访问链路,就需要从几个系统上拿日志,人肉运维是很费时费力的。
03. OOM 、CPU 占用率高等异常分析
上面说到的各种错误,基本上是有明确的代码问题,不管是代码本身的问题,还是数据的问题导致代码报错,另外一种不是“显性”的异常(最终可能依然是代码的问题),比如内存使用过高、CPU使用过高、 频繁 Full GC、OOM 等等,通常这一类的问题不好重现、定位困难。
如果有报错信息,首先还是要查找关键报错信息,比如 java.lang.OutOfMemoryError: Java heap space,很明显就是堆溢出;
这时候你需要知道堆里面存的是什么,这样有助于你进行问题的排查:Java 堆用于存储对象实例,如果有大量的对象无法被垃圾回收机制清除,那么超过堆容量限制之后,就会发生溢出;
我们可以使用内存映像分析工具,对堆储存快照进行分析;如果有内存泄漏,可以通过工具查看泄漏对象;如果不存在泄漏的话,可以检查代码中是否有递归、死循环等等。
当然,不同“部位”泄漏和溢出的原因都是不同的,需要具体分析。如果是 CPU 过高,可以通过系统命令来定位问题:
一般 Java 程序 CPU 过高,可能是这几种原因:死循环、计算比较密集、IO 读写高、请求堵塞等等;
通过 top 命令,查看当前服务器占用 CPU 资源最多的进程,得到进程号 PID = 4454;
通过 top -Hp 4454 查询 4454 进程中各个线程的资源使用率;比如有一个线程 4492 占用 CPU 特别高;
通过 printf "%x " 4492 命令,把线程 id 转化为十六进制;4492 的十六进制是 118c;
使用 jstack 命令打印堆栈信息:jstack 4454 | grep -10 118c;
根据占用 CPU 高的线程的堆栈信息,分析对应的代码在做什么操作,并进行优化。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
回答于 2019-09-11 08:43:50
将本地的代码写好,运行的时候,对于新手的我们难免会出现各种报错信息,以下是我在项目过程中:定位错误信息的几种方式。
一、最原始的-控制台报错的信息
通过查看控制台报错信息,将报错内容翻译出来(通过多次项目编码的过程中,大部分报错信息都差不多,可以记住一些常见的英文单词,以便下次可以快速的定位问题),这样基本上就可以将问题定位出来,这也是最好解决的状况,也是表明你是菜鸟的重要体现(不过没有关系,下次注意就好了,成长是需要一个过程的)。
二、初中级-使用debug定位+try catch捕获异常信息
该方法主要是针对本地代码可以启动,页面也可以正常显示,某些功能不能正常实现的问题。首先确保项目是用debug起的,将具体的方法代码找到,打上断点,找到具体的报错的地方,使用try-catch将异常信息打印出来,通过控制台查看异常信息,定位问题。(该方法主要是适用于自己写的需求代码,也是开发过程中最常用的定位问题手段)
三、中级阶段-查看eclipse安装目录下的log日志信息
这个手段也是我们在开发过程中常用的,我们可以通过查看log日志看到具体报错信息(我在项目中,一般是用来定位页面报错信息,就是页面打不开或者报错),在eclipse安装目录下找到一个.log文件,用一个文本编辑器打开(我使用的是EditPlus),先将原来的日志信息删除,然后在重新点开页面,使用EditPlus的话点击重新载入就可以看到新的报日志信息,将error的信息选中,定位error就好了。
四、高级阶段-使用xshell查看日志信息
如果你们公司项目每个方法进出都记录了操作日志或者info日志,你可以使用xshell查看错误信息,该方法一般是不跑本地代码,直接定位环境上的错误信息(大项目的时候)。
总的一句话,主要我们在项目中经常性的总结,随着接触的项目需求越来越多,我们定位问题的速度也是越来越快的,记住:千里之行始于足下,坚持到最后的,才能够笑到最后!
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |