百科问答小站 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所做的那种优化…的一部分效果。反正肯定会有人抱怨这样不好的啦,是不是要顶住压力硬上就看到底在特定场景里带来的性能好处是不是真的那么重要了。




  

相关话题

  java中的==和equals有什么区别? 
  有没有那么一次,Java让你欣喜若狂? 
  使用yield可以做哪些很酷的事情? 
  红芯浏览器真的自带了假的证书用以监控 HTTPS 内容吗? 
  如何看待越来越多公司弃用 PHP 使用 Java? 
  学编程什么的需要专业版Windows吗? 
  为什么国内技术社区的影响力越来越弱呢? 
  儿童学编程,教什么编程语言好? 
  java设计request body为什么设计成只允许读取一次??? 
  重载 Throwable.fillInStackTrace() 方法以提高Java性能这样的做法对吗? 

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





© 2025-03-24 - tinynew.org. All Rights Reserved.
© 2025-03-24 - tinynew.org. 保留所有权利