您好,登录后才能下订单哦!
这篇文章主要介绍java中e.printStackTrace()会不会输出到控制台,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
java中e.printStackTrace()只会输出到控制台吗?不会输出到日志文件吗?要想输出到日志文件是否需要logger.error(e)?需要logger.error(e)还是logger.error(e.printStackTrace())?
e.printStackTrace()只会输出到控制台吗
tomcat下会输出到catalina.out
不要用e.pringStackTrace()打日志
如果要输入调用栈的话,log.error("错误信息",e);,不输出调用栈的话就log.error("错误信息");
忽然笑
e.pringStackTrace()底层是调用了System.err.println().应该这样用
try{
//doSomething
}catch(IllegalAccessExceptione){
logger.error("错误信息:",e);
}
e.printStackTrace()会导致锁死?
注意右下角区域,红框部分。这块内存是什么呢?非堆!那么,左边是代码缓存区内存,右边红框就是字符串池,常量,基本类型数据的内存区。然后呢?已经满了。什么原因呢?e.printStackTrace()!
满了的后果呢?整个web服务,访问之后,没响应了,就当是卡死掉了。
看看有多少web的请求线程,被卡住在打印这一步!原因呢?要打印字符串输出到控制台上,那你字符串常量池所在的内存块要有空间啊。然而,因为e.printStackTrace()语句要产生的字符串记录的是堆栈信息,太长太多,内存被填满了!注意上面代码语句:4208行!
来看图3:
没毛病,没没事儿找事儿冤枉谁。就是这句代码惹的祸!当然,我承认,被try住的代码本身就有问题,导致很多调用都会抛异常。
那么,让我们再来理理整个事件产生的经过:
短时间内大量请求访问此接口->代码本身有问题,很多情况下抛异常->e.printStackTrace()来打印异常到控制台->产生错误堆栈字符串到字符串池内存空间->此内存空间一下子被占满了->开始在此内存空间产出字符串的线程还没完全生产完整,就没空间了->大量线程产出字符串产出到一半,等在这儿(等有内存了继续搞啊)->相互等待,等内存,锁死了,整个应用挂掉了。
以上是“java中e.printStackTrace()会不会输出到控制台”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。