1)内存占用问题
e.printStackTrace() 在将异常打印到控制台时,将产生错误堆栈信息存入到字符串池中,如果在常量池空间较小异常较多时,常量池空间可能会被异常信息占满,这样其他需要使用或者正在使用此空间的线程就会产生阻塞相互等待的现象,最终抛出 OOM,导致整个应用挂掉。
3)性能问题
如下代码中的synchronized关键字告诉我们e.printStackTrace()执行时会有并发锁,若果在异常代码频繁被调用执行时,e.printStackTrace()的性能会下降
private void printStackTrace(PrintStreamOrWriter s) {
// Guard against malicious overrides of Throwable.equals by
// using a Set with identity equality semantics.
Set dejaVu =
Collections.newSetFromMap(new IdentityHashMap());
dejaVu.add(this);
synchronized (s.lock()) {
// Print our stack trace
s.println(this);
StackTraceElement[] trace = getOurStackTrace();
for (StackTraceElement traceElement : trace)
s.println("tat " + traceElement);
// Print suppressed exceptions, if any
for (Throwable se : getSuppressed())
se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, "t", dejaVu);
// Print cause, if any
Throwable ourCause = getCause();
if (ourCause != null)
ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu);
}
}
3)不利于对日志信息的管控,使用logback、log4j可以根据实际业务情况选择性的输入日志级别,便于日志的管理



