Feedback
# re: Java Exception性能问题[未登录]
2010-07-09 16:50
Jacky
值得借鉴 3Q 回复 更多评论
# re: Java Exception性能问题
2010-07-09 16:54
去改变
# re: Java Exception性能问题
2010-07-09 18:45
rox
一直知道异常过多,会有问题,但不知道为什么?
谢谢了! 回复 更多评论
# re: Java Exception性能问题
2010-08-12 17:58
啊宝
我们的系统也是用异常做的控制业务流程的,提到异常就烦 回复 更多评论
# re: Java Exception性能问题
2010-08-13 09:08
stone2083
@啊宝
控制流程用Exception(try..catch)也好,还是ResultModel(if..else)也罢.只是不同的设计理念而已.
都可以,都对
至于提到异常烦,如果是为性能问题.我以为大可不必.
1.异常的性能没那么差.在上面的测试中,一个异常的产生,0.02ms而已
2.大多数的应用,对性能要求并非很高
3.引起性能瓶颈的,往往是不合理的设计,错误的使用同步等业务代码产生的.
4.实在不行,就是用改进后的异常
如果再不行,那么只好抛弃业务异常吧
如果再不行,那么只好抛弃java改用c等语言吧.
选择一种语言也好,选择一种设计也罢,只是为了更好的处理需求而已.
至于上文,只是为了描述异常的本质.在了解原理的基础上,让业务异常的使用不出现性能的浪费而已.
绝不是表明,异常性能真得对系统产生了影响 :)
回复 更多评论
# re: Java Exception性能问题
2012-09-20 12:18
alswl
感谢分析,知道为什么异常引起瓶颈了 回复 更多评论
# re: Java Exception性能问题
2012-11-27 17:07
fillInStackTrace的 synchronized 无影响
测试 new Exception() 时,我多测试一个自定义异常,在其中覆写,fillInStackTrace,但是,带着 synchronized 修饰符。运行结果显示:是否带有 synchronized 修饰符 对耗时没有任何影响
win7
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01, mixed mode) 回复 更多评论
# re: Java Exception性能问题
2012-11-27 17:10
fillInStackTrace的 synchronized 无影响
# re: Java Exception性能问题
2012-11-28 11:27
stone2083
@fillInStackTrace的 synchronized 无影响
throw对于jvm来说,只是一条athrow指令,将异常压栈出栈而已。所以开销非常小。
至于synchronized测试,能否将你的测试代码贴一下(是在多线程条件下测试的吗?)
我之前的数据没有了,这次新做了测试,差异还是很大的。
20个线程下:
Opt Take Time: 1372
Gen Take Time: 36510
50个线程下:
Opt Take Time: 3906
Gen Take Time: 88240
mac jdk 1.6 64bit 回复 更多评论
# re: Java Exception性能问题
2013-01-20 01:17
weipeng
@stone2083
我这边单线程测试,不使用同步的已经比使用同步的快了约3倍。所以同步还是有影响的,毕竟有monitor的进入和退出。
ps:
业务异常我也比较喜欢,但是就是有篡改失败的结果的可能,比如偷懒catch了Exception。
try {
// member 不存在
throw new BusinessException(Xxx);
// offer不存在
throw new BusinessException(Yyy);
// 调用一些业务接口,如 xxx.create(param); 但是它throws 自定义异常
} catch (Exception) { // 对捕获到业务接口的异常,想返回系统错误
throw new BusinessException("SystemError...");
}
这样就造成了,如果member不存在,那么就返回系统错误了,而不是原来想的member不存在的业务编码了。
所以,我觉得如果使用业务异常来做控制,那么调用端,在调用时可以避免对错误的判空,而且层次感通过catch来的比较养眼。但是有点劣势的就是要求在实现内部对于异常的处理要求非常统一。 回复 更多评论
# re: Java Exception性能问题
2013-01-21 11:03
stone2083
@weipeng
确实,存在如你所说的问题。
但是问题的本质还在于使用者,忽视业务分支逻辑导致的。
即便使用If Else,也存在类似的问题(只是发生普遍性相对会小),如:
if(result.isMemberNotFound || result.isOfferNotFound) {
System.out.println("Sys Error.");
}
我现在到不纠结使用哪种形式,唯一要求是:同个项目内部要保持风格统一,并且规范使用。 回复 更多评论
# re: Java Exception性能问题[未登录]
2013-12-17 16:07
呵呵
异常不应该被用来做业务,即使通过改写也一样,同样需要创建一个实例,new一个实例同样是不小的开销,虚拟机还要对他进行回收。如果异常情况反复出现,同样会大量消耗系统资源。异常当然是用来做异常的,异常字面意思就是系统运行正常的时候不应该出现的,如果出现了才被认为是异常。所以异常应该是很少出现的,由于使用try-catch减少了if判断,提升了性能。所以异常是为了提升性能的,不是用来消耗性能的。 回复 更多评论
# re: Java Exception性能问题
2014-08-15 16:08
wyc
classloader不是就是用异常来处理业务的么,自己定义的类肯定要通过异常截获来加载 回复 更多评论
# re: Java Exception性能问题
2014-11-24 17:50
zuidaima
# re: Java Exception性能问题[未登录]
2015-12-16 14:48
小明
没有并发,测试准么? 回复 更多评论
# re: Java Exception性能问题
2015-12-16 19:18
stone2083
@小明
private static final ExecutorService POOL = Executors.newFixedThreadPool(30); 回复 更多评论