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、看代码


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1天前
|
Java Linux C语言
一步带你了解java程序逻辑控制
一步带你了解java程序逻辑控制
8 2
|
1天前
|
Java 数据安全/隐私保护
java中程序控制的典例
java中程序控制的典例
7 1
|
2天前
|
存储 Java 数据库连接
使用Java开发桌面应用程序
使用Java开发桌面应用程序
8 0
|
2天前
|
关系型数据库 MySQL Java
通过使用阿里云服务器,搭建Java程序的运行环境
通过使用阿里云服务器,搭建Java程序的运行环境
|
9天前
|
存储 网络协议 Java
本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件
本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件
|
11天前
|
存储 Java 开发工具
【Java探索之旅】用面向对象的思维构建程序世界
【Java探索之旅】用面向对象的思维构建程序世界
10 0
|
11天前
|
小程序 Java 程序员
【Java探索之旅】我与Java的初相识(二):程序结构与运行关系和JDK,JRE,JVM的关系
【Java探索之旅】我与Java的初相识(二):程序结构与运行关系和JDK,JRE,JVM的关系
27 0
|
1天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
9 0
|
1天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
8 0
|
1天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
5 0