创建
异常对象并不比创建其他常规对象贵。主要成本隐藏在本机
fillInStackTrace方法中,本机方法遍历调用堆栈并收集所有必需的信息以构建堆栈跟踪:类,方法名称,行号等。
有关高异常成本的神话来自大多数
Throwable构造函数都隐式调用的事实
fillInStackTrace。但是,有一个构造函数可以创建
Throwable没有堆栈跟踪的。它使您可以快速实例化可抛出对象。创建轻量级异常的另一种方法是重写
fillInStackTrace。
现在 抛出 异常怎么办?
实际上,这取决于在哪里 捕获 引发的异常。
如果使用相同的方法(或更确切地说,在相同的上下文中,因为上下文可以由于内联而包含多种方法)捕获它,则
throw它的速度和简便性
goto(当然,在JIT编译之后)也是如此。
但是,如果某个
catch块位于堆栈的更深处,那么JVM需要展开堆栈帧,这可能需要更长的时间。如果
synchronized涉及到块或方法,则花费的时间甚至更长,因为展开意味着释放已删除堆栈帧所拥有的监视器。
我可以通过适当的基准确认以上陈述,但是幸运的是,我不需要这样做,因为HotSpot的性能工程师Alexey
Shipilev的帖子已经很好地涵盖了所有方面:Lil’Exception
的出色性能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)