前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自定义异常为什么性能差,我来告诉你

自定义异常为什么性能差,我来告诉你

作者头像
公众号 IT老哥
修改2020-09-21 15:29:58
1.4K0
修改2020-09-21 15:29:58
举报

本文源自 公-众-号 IT老哥 的分享

IT老哥,一个在大厂做高级Java开发的程序员,每天分享技术干货文章

老哥哔哔叨

大家应该都经历过双十一吧,那个流量大的恐怖吧,那个并发高的吓人吧。那么在一个高并发的系统里,有哪些点是影响系统性能的呢,今天我们来讲其中一个点:自定义异常

如果对大家有所帮助,请给个【在看】和【点赞】

疯狂的异常

为什么异常会影响性能

首先给大家看一段JDKThrowable源码

代码语言:javascript
复制
public synchronized Throwable fillInStackTrace() {
    if (stackTrace != null ||
        backtrace != null /* Out of protocol state */ ) {
        fillInStackTrace(0);
        stackTrace = UNASSIGNED_STACK;
    }
    return this;
  }

上面这段JDK的源码就是抛出异常时会调用的方法,这段方法暴露出两个问题

  • 使用了synchronized修饰整个异常方法
  • 将异常追踪信息放到了堆栈中(想想JVM线程

异常种类

  • 业务异常这些是我们自定义的、可以预知的异常,抛出这种异常并不表示系统出了问题,而是正常业务逻辑上的需要,例如用户名密码错误、参数错误等。
  • 系统异常往往是运行时异常,比如数据库连接失败、IO 失败、空指针等,这种异常的产生多数表示系统存在问题,需要人工排查定位。

相信大家都接触过异常,对于业务异常,我们只需要简单的知道一个描述问题的字符串即可,栈追踪信息对我们的意义并不大。而对于系统异常,追踪信息才是排查错误不可或缺的参考。

大家试想,如果前端传的参数错了,系统里就抛出一个异常,那么在双十一的情况下一秒钟得抛出多少个异常呢?

问题思考

  • 抛异常的时候是不是会被 synchronized 上同步锁?
  • 需不需要线程去执行?
  • 是不是得创建异常对象?
  • 需不需要堆栈去存储?
  • 需不需要 jvm 去垃圾回收?

性能测试

  • 创建普通 Java 对象 (CustomObject extends HashMap)
  • 创建普通 Java 异常对象(CustomException extends Exception)
  • 创建改进的 Java 业务异常对象 (CustomException extends Exception,覆写 fillInStackTrace 方法,并且去掉同步)

测试结果

(运行环境:xen 虚拟机,5.5G 内存,8 核;jdk1.6.0_18)

(10 个线程,创建 10000000 个对象所需时间)

  • 普通 Java 对象:45284 MS
  • 普通 java 异常:205482 MS
  • 改进的 Java 业务异常:16731 MS

大家可以看到正常抛出 Exception 的和覆写了 fillInStackTrace 的 Exception,性能差距了很多倍,如果高并发的系统里,就像雪球一样越滚越大。影响系统的并发量。

解决方案:覆写 fillInStackTrace

我们来看看非常 NB 的kafka源码是如何优化的。

代码语言:javascript
复制
/* avoid the expensive and useless stack trace for api exceptions */
/* 翻译:避免对api异常进行昂贵且无用的堆栈跟踪 */
@Override
public Throwable fillInStackTrace() {
    return this;
}

很多开源框架都是这样处理,避免不必要的性能浪费。

老哥结语

什么是匠人精神,就是将一件事情做到极致。优化永无止境,且行且珍惜。

云服务器云硬盘数据库(包括MySQL、Redis、MongoDB、SQL Server),CDN流量包,短信流量包,cos资源包,消息队列ckafka,点播资源包,实时音视频套餐,网站管家(WAF),大禹BGP高防(包含高防包及高防IP),云解析SSL证书,手游安全MTP移动应用安全云直播等等。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-23 19:08:57,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT老哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文源自 公-众-号 IT老哥 的分享
  • 老哥哔哔叨
  • 疯狂的异常
    • 为什么异常会影响性能
      • 异常种类
        • 问题思考
          • 性能测试
            • 测试结果
              • 解决方案:覆写 fillInStackTrace
              • 老哥结语
              相关产品与服务
              实时音视频
              实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开发者快速搭建低成本、低延时、高品质的音视频互动解决方案。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档