为了有效地使用垃圾收集器,在Java中保留异常是否更好?

时间:2015-10-26 11:39:25

标签: java garbage-collection heap

我想减少垃圾收集器。使用此代码更好:

private MyException myException = new MyException();

public void frequentlyUsedMethod(){
  try{
    ...
  }catch(Exception e){
    throw myException;
  }
}

而不是:

public void frequentlyUsedMethod(){
  try{
    ...
  }catch(Exception e){
    throw new MyException();
  }
}

如果我在第一种情况下理解正确,我们只创建一次MyException,但在第二种情况下,我们将阻塞我们的堆并多次诱导垃圾收集器。

1 个答案:

答案 0 :(得分:6)

没有!使用通常的惯用方法,每次都抛出一个新的异常。您建议的方法存在一些问题:

  1. 它会丢弃任何合理的堆栈跟踪,这是异常被抛出程序(或记录)时最重要的事情。堆栈跟踪在异常创建时填充,而不是在抛出时,因此所有堆栈跟踪都是相同的,没有信息,并且您将不知道哪个方法抛出它们:

    Exception in thread "main" your.package.MyException
    at your.YourClass.<clinit>(YourClass.java:6)
    
  2. 由于“性能”原因,代码变得更加难以理解。除非你能证明你的改变能带来显着的改变,否则这总是一种可靠的方法。异常对象很可能不会存在很长时间 - 在这种情况下,为

  3. 清除非常便宜。

    顺便说一句,如果你的方法经常抛出一个异常会产生影响,那么你无论如何都会做出非常错误的事情。