Java程序排错定位

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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日志并进行多维度分析。
目录
打赏
0
0
0
0
1
分享
相关文章
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
课时7:Java程序基本概念(注释)
课时7介绍了Java程序中的注释。编程语言有其语法和语义,注释有助于理解代码需求,防止断档。Java支持三类注释:单行(//)、多行(/* */)和文档注释(/** */)。注释不会被编译器编译。范例中展示了如何在代码中使用注释,并强调了注释对项目文档管理的重要性。
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
课时5:第一个Java程序
课时5介绍了编写第一个Java程序的步骤,包括创建Hello.java文件、编写“Hello World”代码、编译和运行程序。主要内容有:1) 新建并编辑Hello.java;2) 编译Java源文件生成.class文件;3) 通过命令行解释执行Java程序;4) 解释主方法的作用及信息输出操作。本课强调了类定义、文件命名规则和基本程序结构的重要性,并建议初学者使用记事本编写代码以熟悉基础语法。
消防救援支队消防员单兵装备智能养护舱电机驱动java版程序(二)
本文探讨消防救援中智能养护舱电机驱动的Java程序设计,作为系列文章第二部分。通过自动化和智能化手段,智能养护舱提升了装备维护效率与准确性。文章详细介绍了电机驱动模块的设计与实现,包括硬件选型、PID控制策略、安全保护机制及Java程序架构,确保电机精确控制、稳定性和安全性。未来将优化功能并引入智能算法和物联网技术,进一步提升装备维护智能化水平。
消防救援支队消防员单兵装备智能养护舱点击驱动java版程序(一)
智能消防作战服架通过电机驱动系统提升消防员作业效率和安全性。本文介绍基于Java的电机驱动程序开发,涵盖硬件准备、软件环境搭建及驱动程序实现。重点包括串口通信配置、电机控制类设计与控制逻辑实现,确保电机高效稳定运行。通过正确配置通信协议和串口参数,并添加异常处理机制,保障系统的安全性和可靠性。
|
2月前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
213 60
【Java并发】【线程池】带你从0-1入门线程池
|
20天前
|
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
56 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递