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

Ale*_*ndr 3 java heap garbage-collection

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

private MyException myException = new MyException();

public void frequentlyUsedMethod(){
  try{
    ...
  }catch(Exception e){
    throw myException;
  }
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

public void frequentlyUsedMethod(){
  try{
    ...
  }catch(Exception e){
    throw new MyException();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*ček 6

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

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

    Exception in thread "main" your.package.MyException
    at your.YourClass.<clinit>(YourClass.java:6)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 由于"性能"原因,代码变得稍微不可读.除非你能证明你的改变能带来显着的改变,否则这总是一种可靠的方法.异常对象很可能不会存在很长时间 - 在这种情况下,为GC清理它是非常便宜的.

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