百科问答小站 logo
百科问答小站 font logo



重载 Throwable.fillInStackTrace() 方法以提高Java性能这样的做法对吗? 第1页

  

user avatar   rednaxelafx 网友的相关建议: 
      

只要那个自定义异常类型是真的不需要stack trace的,我也会推荐覆写fillInStackTrace()为直接返回this。

爬栈是抛异常开销大的主要原因之一。

<- 但注意好前提就是了——要确定真的肯定绝对不需要stack trace的话。

一个简单的例子是,“滥用”异常来实现某些特殊控制流结构的场景,此时stack trace肯定是没用的,那个异常对象本身其实也没用,只有它的类型和抛出它带来的控制流跳转才有用,那就应该覆写fillInStackTrace()。

=======================================

然后从反面举个例子。HotSpot VM有个许多人觉得“匪夷所思”的优化,叫做fast throw:有些特定的隐式异常类型(NullPointerException、ArithmeticException( / 0)之类)如果在代码里某个特定位置被抛出过多次的话,HotSpot Server Compiler(C2)会透明的决定用fast throw来优化这个抛出异常的地方——直接抛出一个事先分配好的、类型匹配的异常对象。这个对象的message和stack trace都被清空。抛出这个异常的速度是非常快,不但不用额外分配内存,而且也不用爬栈;但反面就是可能正好是需要知道哪里出问题的时候看不到stack trace了。

从Sun JDK5开始要避免C2做这个优化还得额外传个VM参数:-XX:-OmitStackTraceInFastThrow。

覆写fillInStackTrace()为直接返回this就像是人肉做C2所做的那种优化…的一部分效果。反正肯定会有人抱怨这样不好的啦,是不是要顶住压力硬上就看到底在特定场景里带来的性能好处是不是真的那么重要了。




  

相关话题

  在测试驱动开发中 如果测试写错了导致单元测试过不了怎么办?如何保证测试的正确性呢? 
  为什么用自然语言进行编程不流行呢? 
  当一个程序员失去了对代码的兴趣,变得没有目标没有动力,是怎样的体验? 
  男朋友的大脑是单线程的怎么办? 
  感觉算法在程序员中快被吹上天了,如果只是搞编程的话,是不是没必要死磕算法? 
  如何评价《轩辕剑外传穹之扉》制作人杨渊升针称《巫师 3》「200 人三年的制作规模,我们真的也可以」? 
  C语言能用指针修改其他程序的地址的值吗? 
  什么是函数式编程思维? 
  程序员讲到底就是”增删改查“吗? 
  学校和机构都建议孩子放弃 Python 转 C++,我该如何处理? 

前一个讨论
java能否获取到引用的名称?
下一个讨论
为什么一说到 C#,很多人都说跟微软绑太紧,说到 Objective-C,就没人说跟苹果绑太紧呢?





© 2024-11-09 - tinynew.org. All Rights Reserved.
© 2024-11-09 - tinynew.org. 保留所有权利