都说生产环境禁用e.printStackTrace(),因为会“产生错误堆栈字符串到字符串池内存空间”,那如果我用slf4j的日志,long.info("error:",e)打印,也会产生很多字符串,是不是效果也跟e.printStackTrace()一样。
注:仅讨论日志都输到控制台的情况。
都说生产环境禁用e.printStackTrace(),因为会“产生错误堆栈字符串到字符串池内存空间”,那如果我用slf4j的日志,long.info("error:",e)打印,也会产生很多字符串,是不是效果也跟e.printStackTrace()一样。
注:仅讨论日志都输到控制台的情况。
禁用e.printStackTrace()
和禁用System.out.println
的理由是一样
相比于打日志,这两个少了比如时间、线程这些信息,而且不能像日志一样配置级别和开关,也不能(至少不方便)配往哪里输出
如果目的是打日志,那就老老实实打日志
如果是只是随便写demo测东西,那就随意了
至于 产生错误堆栈字符串到字符串池内存空间 ,没看懂什么意思,这些字符串也不会进常量池的
15 回答8.4k 阅读
8 回答6.2k 阅读
4 回答4.4k 阅读✓ 已解决
4 回答4k 阅读
1 回答2.9k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
可以看下
e.printStackTrace()
的源码,这个方法的性能是比较差的,里面除了需要synchronized显式同步外,还需要调用native的方法获取堆栈信息,所以一般在生产环境是不推荐使用的。生产环境下一般都是异步打印日志的,使用e.printStackTrace()
显然不合适。