news 2026/1/11 13:38:35

Java 进阶:异常影响性能吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 进阶:异常影响性能吗?
  • Java 进阶异常影响性能吗
    • catch 中不做任何事情
    • catch 中输出异常到日志
    • catch 中获取异常栈
    • 总结

Java 进阶:异常影响性能吗?

曾经在给一个业务系统增加限流功能,使用的限流组件在流量超过阈值时,会直接抛异常,异常导致 CPU 占用率飙升。第一次遇到这样的情况,让我们不得不思考,异常怎么会对性能造成这么大的影响?

下面我们写几个测试程序观察一下。

catch 中不做任何事情

public class ExceptionTest { public static void main(String[] args) { doExTest(); doExTest(); } private static void doExTest() { long start = System.nanoTime(); for (int i=0; i<100000; ++i) { try { throw new RuntimeException("" + Math.random()); } catch (Exception e) { } } System.out.println("time: " + (System.nanoTime() - start)); } }

测试结果如下:

time: 365218274
time: 224583244

第一次 doExTest 只是起到预热的作用,我们以第二次 doExTest 的时间为准。10 万次请求,平均每次请求耗时 2245 纳秒,也就是 0.002 毫秒,速度还是很快的。

catch 中输出异常到日志

public class ExceptionTest { private static final Logger logger = LoggerFactory.getLogger(ExceptionTest.class); public static void main(String[] args) { doExTest(); doExTest(); } private static void doExTest() { long start = System.nanoTime(); for (int i=0; i<100000; ++i) { try { throw new RuntimeException("" + Math.random()); } catch (Exception e) { logger.error("fuck", e); } } System.out.println("time: " + (System.nanoTime() - start)); } }

测试结果如下:

time: 13454674590
time: 9891780450

10 万次请求,平均每次请求耗时 98917 纳秒,大约 0.1 毫秒,比“不输出异常”的时候,慢了 50 倍。输出日志如此耗费性能,那么 logger.error 这一句做了什么事儿呢?
1. 根据过滤规则,判断是否要输出日志
2. 获取异常堆栈
3. 拼接日志字符串,输出日志到文件

获取异常堆栈主要调用的如下方法,下面我们写程序,不输出日志到文件,测试只读取异常栈的性能:

public class Throwable implements Serializable { public StackTraceElement[] getStackTrace() { return getOurStackTrace().clone(); } private synchronized StackTraceElement[] getOurStackTrace() { // Initialize stack trace field with information from // backtrace if this is the first call to this method if (stackTrace == UNASSIGNED_STACK || (stackTrace == null && backtrace != null) /* Out of protocol state */) { int depth = getStackTraceDepth(); stackTrace = new StackTraceElement[depth]; for (int i=0; i < depth; i++) stackTrace[i] = getStackTraceElement(i); } else if (stackTrace == null) { return UNASSIGNED_STACK; } return stackTrace; } }

catch 中获取异常栈

public class ExceptionTest { public static void main(String[] args) { doExTest(); doExTest(); } private static void doExTest() { long start = System.nanoTime(); for (int i=0; i<100000; ++i) { try { throw new RuntimeException("" + Math.random()); } catch (Exception e) { StackTraceElement[] stackTrace = e.getStackTrace(); } } System.out.println("time: " + (System.nanoTime() - start)); } }

测试结果如下:

time: 1559107012
time: 795376775

10 万次请求,平均每次请求耗时 7953 纳秒,大约 0.008 毫秒,比“不输出异常”的时候,慢了 4 倍。这么看获取堆栈耗时并不多,耗时主要在输出日志到文件中。

总结

处理异常的几个步骤里,对性能的耗费从大到小依次为:输出到日志、获取异常堆栈、创建并 catch 异常。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/9 22:00:15

计算机深度学习毕设实战-基于人工智能深度学习的猫的种类识别基于python-cnn深度学习的猫的种类识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/1/7 22:49:33

售后完善的高速线剥线机源头厂家

《高速线剥线机哪家好&#xff1a;专业深度测评》开篇&#xff1a;定下基调在工业自动化与智能制造快速发展的今天&#xff0c;高速线剥线机作为电线电缆加工环节中的关键设备&#xff0c;其效率、精度与稳定性直接影响生产节奏与产品质量。面对市场上琳琅满目的品牌与型号&…

作者头像 李华
网站建设 2026/1/10 13:06:15

从入门到精通:程序员必学的9种RAG架构实战指南,解决大模型幻觉问题

本文详细介绍了9种RAG架构及其适用场景&#xff0c;包括标准RAG、对话式RAG、纠正性RAG等&#xff0c;强调应根据实际需求选择合适架构而非盲目追求复杂度。文章提供了从简单开始的决策框架&#xff0c;提醒避免过度设计、忽略检索质量等陷阱。RAG可将语言模型从"自信的谎…

作者头像 李华
网站建设 2026/1/7 22:44:32

StatelessWidget与StatefulWidget区别与使用场景

Flutter核心技术解析&#xff1a;StatelessWidget与StatefulWidget的深度对比与实践指南 引言 在Flutter的世界中&#xff0c;Widget是构建用户界面的基本单元。对于每一个Flutter开发者而言&#xff0c;深刻理解StatelessWidget与StatefulWidget的区别不仅是入门必修课&#x…

作者头像 李华
网站建设 2026/1/9 22:53:12

Java进阶10 IO流

Java进阶10 IO流 IO流就是数据传输。I为input的缩写&#xff0c;表示输入读取&#xff1b;O为out的缩写&#xff0c;表示输出写出。 一、IO流体系结构巧记区分tips&#xff1a;以Stream结尾的是字节流&#xff1b;以Reader、Writer结尾的都是字符流 二、字节输出流FileOutputSt…

作者头像 李华