这可能是一个奇怪的问题,但是'try-catch'块会在服务器环境中添加内存,而不仅仅是运行特定的代码块。例如,如果我执行打印堆栈跟踪,JVM是否会继续查看更多信息。或者更多信息保留在堆上?
try {
... do something()
} catch(Exception e) {
e.printStackTrace();
}
... do something()
答案 0 :(得分:2)
该异常将提供对堆栈跟踪的引用。 printStackTrace将分配更多的内存,因为它将堆栈跟踪格式化为漂亮的东西。
try catch块可能会导致很大程度上静态的代码/数据段,但不会导致运行时内存分配
答案 1 :(得分:1)
重要的是,一旦异常变量'e'不再可达(即超出范围),它就有资格进行内存收集。
答案 2 :(得分:0)
创建异常时会构建堆栈跟踪。打印堆栈跟踪除了打印任何其他内容之外,不会占用更多内存。
try / catch块可能会有一些性能开销,但不会增加内存需求。
答案 3 :(得分:0)
在大多数情况下,不要担心发生异常时的内存/性能。如果您的异常是一个公共代码路径,则表明您滥用异常。
如果您的问题更多是出于学术目的,那么我不知道堆/内存空间方面的完整程度。但是,“Effective Java”中的Joshua Bloch提到try catch块的catch块通常被大多数JVM实现相对不优化。
答案 4 :(得分:0)
从技术上讲,你的问题的答案可能是否定的。尽可能避免抛出异常有很多理由,但记忆并不是真正的问题。
仅针对真正异常情况抛出异常的真正原因是它很慢。生成异常涉及仔细检查堆栈。这根本不是一个快速的操作。如果您在定期执行流程中执行此操作,则会显着影响您的速度。我曾经写过一个我认为非常聪明的日志记录系统,因为它通过生成异常并以这种方式检查堆栈,自动找出哪个类调用了它。最终我不得不回去把它拿走,因为它显着减缓了其他一切。
答案 5 :(得分:0)
虽然与内存消耗没有直接关系,但在这里讨论了一段时间How slow are the Java exceptions?在我看来值得一看。
我的书签中也有link。据我所知,它提供了一个例子,当异常抛出时跳过堆栈跟踪生成时可以加速,但现在网站似乎已经停止了。