都 9102 了,你还不知道 System.out.println 的危害!

JAVA herman 411浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

最近需要改一个老项目,项目代码非常的多,完全称得上是“大而全”。

老项目里面的代码,经过几代人的编写,非常难以读懂,而且出处是 System.out.println(),今天我抽个时间给大家说一说,为什么大多数人都被告知不要在 Java 应用中使用 System.out.println!

System.out.println 的危害

1、第一个原因就是它不能实现日志按等级输出。具体来说就是不能和日志框架一样,有 debug,info,error 等级别的控制。

2、它的输出,你不太容易从日志当中快速的跟踪到代码。包括它无法输出具体的类名,方法名,具体代码行数等。

3、第三个原因就是,它的性能太差。

System.out.println 的底层源码

你通过这个 synchronized 关键字,你就会发现,如果项目中大量的使用了 System.out.println,最终会导致整个代码调用成了“串行”输出。

有时候不是你的 JVM 没优化好,二是你写的代码就像再打草稿!

感兴趣的网友,可以针对 System.out.println 做一个压力测试,看看它的性能报告。

System.out.println 性能并不好。当我们深入分析时,其调用顺序如下 println – > print – > write()+ newLine()。所以,一些公司在 OpenJDK 的基础上就完全的把它禁用掉,或者换成其他的实现。

System.out.println VS 日志记录组件

这里以 Log4J 为例,Log4J 具有多种记录级别。如果我们正在编写一个小程序,只是为了实验/学习目的那么使用 System.out.println 就很不错。但当我们开发生产质量软件时,我们应该注意到应该使用记录组件(log4j等),并且应该避免使用 System.out.println。为什么?

  • 灵活性:log4j的记录器提供了多种记录级别。我们可以相应地分隔日志信息。例如,X消息只能在PRODUCTION上打印,Y消息应打印在ERROR等上。
  • 可重构性:log4j只需一个参数更改即可关闭所有日志记录。
  • 可维护性:想象一下,如果我们有数百个System.out.println全部通过应用程序散落,那么在一段时间内将难以维护程序。
  • 粒度:在应用程序中,每个类都可以有不同的记录器并相应地进行控制。
  • 实用性:在 System.out 中限制重定向消息的选项,但是如果是记录器(like log4j),则可以提供多种选项。我们甚至可以创建自定义输出选项并将其重定向。

所以我们不应该使用 System.out.println 进行日志记录和调试(logging and debugging)。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:codedq(5000人已满),微信号3:xttblog(超2800)。备注:“xttblog”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 都 9102 了,你还不知道 System.out.println 的危害!