Java程序出错了,定位错误有哪些技巧?

售前免费咨询热线: 4 0 0 - 1 8 6 - 0 9 0 5
汇智资讯Huizhi information

当前位置:首页 »Java程序出错了,定位错误有哪些技巧?

Java程序出错了,定位错误有哪些技巧?

日期:2020-04-19 13:54:40 访问量: 来源:

Java程序出错了,定位错误有哪些技巧?排错是衡量程序员水平的一个重要指标,其中最为重要的就是定位错误,不但要定位快速而且要定位准确。我来分享一下我在定位错误方面的一些经验,希望能够对大家有帮助。

Java程序出错了

一、错误的分类

程序运行出错指的是程序未按照程序预设的逻辑执行,从而造成非预期的结果,具体表现就是报错中断或数据错误。作为程序员,一定要分清哪口锅是自己的,对于设计中的预设错误一定要甩出去,例如:传入参数不合法、违反业务规则等等。本节,我们只考虑自己的锅。自己这口锅里能装的错误也很多,但是我们不考虑纯粹的认为因素造成的运行出错(例如版本遗漏、配置错误等等)。

1、有报错的错误

造成这一类错误的原因,主要有:

A. 开发过程不严谨,没有进行必要的判断或没有充分的考虑各种可能的分支(这就是为毛好些java规范里要求if和else要成对出现的原因),这类错误里最为常见的异常就是空指针、下标越界、除数为0等运行时异常了;

B. 内存泄露问题。java对指针进行的透明化处理,GC操作大多数时间也由JVM自主完成,但是毕竟内存中的数据是程序在运行过程中塞进去的,如果数据的生命周期设计存在问题的话,很容易会造成OOM错误。前段时间和一个朋友就聊到了这个问题,他所在公司的一个项目就是因为未及时释放有效数据导致jvm内存占用持续增高,即使JVM执行FullGC操作后,内存占用率依旧很高,从而导致OOM错误。

C. 捕获的范围小了,预期外的错误未捕获。在一个项目中就遇到过这种情况,程序只对Exception进行了捕获,未捕获Error,导致程序在抛出了一个Error(那次是一次人为的原因)而导致未回滚数据库事务,造成了锁表。

2、没报错的错误

造成这一类错误的原因,主要有:

A. 虽然抛出了错误,但是被吃掉了。就是在catch到Exception后没有进行任何处理,包括打印日志。这个的原因就不多说了...说多了都是泪。

B. 程序正常执行完成,但是结果不符合预期。这个原因很可能是程序未对并发安全进行设计。

C. 无限等待,超时时间设置不合理或者死锁。

二、错误的定位

定位错误是有一个大概的顺序的。

1、检查有没有报错信息

日志文件中登记的错误,这个算是最简单的,在定位错误时,也最希望问题在这一步得到确认。在打印异常时,通常会打印异常的调用栈信息,通过调用栈信息就可以很便捷的定位问题了。

2、检查标准输出文件和异常输出文件有没有报错信息

Error可能不会打印在日志文件中(如果关掉了标准输出就不会打印了),但是会打印在标准输出中,前提是没有把标准输出也吃掉。通常在出现错误时,单单通过检查日志来定位问题怕是不足以说明问题,通常还会配合dump文件进行分析,因此在程序启动时需要开启相应参数(-XX:+HeapDumpOnOutOfMemoryError),在JVM出现内存溢出异常时Dump出当前的内存堆转储快照以便后续进行分析。

3、结合系统资源使用情况

如果没有报错的信息,这时候可能需要结合当前的CPU使用率等情况进行分析了。找到最为消耗资源进行针对性的分析,常用的linux命令有:

top (-H -p pid):找到占用CPU最高的线程ID

jstack:打印进程堆栈信息,看看死锁,线程啥的

jstat:监视虚拟机gc之类的功能

jmap:java内存映像工具

kill -3:吓唬jvm用的,让他生成dump文件

netstat: 查看网络连接情况用的

4、看代码

前3步的作用都是为了这一步来服务的,当然代码也需要结合一些日志来分析(总不可能一行都没有吧~)。但是不一定任何时候都能通过前三步找到代码方面的蛛丝马迹的(例如,当没有日志且没有现场时)。咳咳~这时候就体现出代码评审的意义了,一些公司在开发过程中非常不注重代码的走查和评审工作,开发的时候能用就行,出现问题以后又到处甩锅,我只能说:可怜了,我的开发小哥!

汇聚行业精英智慧

致力于高端IT技术人才培养

助力万千学员成就IT梦!

汇智动力

扫码关注 领取资料

www.hzdledu.cn

相关阅读Reading

全国热线:400-186-0905

总部热线:028-6547-1147

周一至周日9:30-24:00

我要咨询
汇智动力微信

汇智动力微信公众号

')