e.printStackTrace()和log打印日志是否都会造成问题?

都说生产环境禁用e.printStackTrace(),因为会“产生错误堆栈字符串到字符串池内存空间”,那如果我用slf4j的日志,long.info("error:",e)打印,也会产生很多字符串,是不是效果也跟e.printStackTrace()一样。
注:仅讨论日志都输到控制台的情况。

阅读 7.7k
3 个回答

可以看下e.printStackTrace()的源码,这个方法的性能是比较差的,里面除了需要synchronized显式同步外,还需要调用native的方法获取堆栈信息,所以一般在生产环境是不推荐使用的。生产环境下一般都是异步打印日志的,使用e.printStackTrace()显然不合适。

“产生错误堆栈字符串到字符串池内存空间”

这是扯淡。

主要是不可控,这个只能输出到std out,强制用日志框架输出的话可以统一管理

禁用e.printStackTrace()和禁用System.out.println的理由是一样
相比于打日志,这两个少了比如时间、线程这些信息,而且不能像日志一样配置级别和开关,也不能(至少不方便)配往哪里输出
如果目的是打日志,那就老老实实打日志
如果是只是随便写demo测东西,那就随意了

至于 产生错误堆栈字符串到字符串池内存空间 ,没看懂什么意思,这些字符串也不会进常量池的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题