为什么在调用栈的较深处抛异常会导致性能问题 ?
这是因为
构建Exception对象时会去取一下当前调用栈的快照(Throwable.fillInStackTrace()),这个操作比较耗时。 栈越深,操作就越耗时。
怎么解决这个问题?
1.
避免滥用Exception作为Flow-Control的工具。 比如判断类型时可以用 instanceof ,而不必强转+捕捉ClassCastException.
2.
重用Exception对象。 这样总体上只需要取一次栈的快照。
3.
覆盖fillInStackTrace()方法,使它变成空方法;也就是说,
不生成快照。