IT老哥,一个在大厂做高级Java开发的程序员,每天分享技术干货文章
大家应该都经历过双十一
吧,那个流量大的恐怖
吧,那个并发高的吓人
吧。那么在一个高并发的系统里,有哪些点是影响系统性能的呢,今天我们来讲其中一个点:自定义异常
如果对大家有所帮助,请给个【在看】和【点赞】
首先给大家看一段JDK
的Throwable
源码
public synchronized Throwable fillInStackTrace() {
if (stackTrace != null ||
backtrace != null /* Out of protocol state */ ) {
fillInStackTrace(0);
stackTrace = UNASSIGNED_STACK;
}
return this;
}
上面这段JDK
的源码就是抛出异常时会调用的方法,这段方法暴露出两个问题
synchronized
修饰整个异常方法JVM
和线程
)相信大家都接触过异常,对于业务异常,我们只需要简单的知道一个描述问题的字符串即可,栈追踪信息对我们的意义并不大。而对于系统异常,追踪信息才是排查错误不可或缺的参考。
大家试想,如果前端传的参数错了,系统里就抛出一个异常,那么在双十一的情况下一秒钟得抛出多少个异常呢?
(运行环境:xen 虚拟机,5.5G 内存,8 核;jdk1.6.0_18)
(10 个线程,创建 10000000 个对象所需时间)
45284 MS
205482 MS
16731 MS
大家可以看到正常抛出 Exception 的和覆写了 fillInStackTrace 的 Exception,性能差距了很多倍,如果高并发的系统里,就像雪球一样越滚越大。影响系统的并发量。
我们来看看非常 NB 的kafka源码
是如何优化的。
/* 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,移动应用安全、 云直播等等。