当我开始学习Java时,我被告知不要在Java EE应用程序中执行System.out.println。但是我真的不知道不这样做的原因是什么。
我完全清楚,如果我们真的需要打印一个重要的,应该使用日志框架记录它。
我真的想在这里问一下: System.out.println 是否存在真正的危险?它会导致任何性能问题吗?
答案 0 :(得分:7)
这确实是一个性能问题。如果深入研究System.out
的JDK源代码,最终会在输出流上遇到synchronized
块。
这意味着如果在源代码中放置了足够的println调用,整个代码库将有效地运行单线程,因为所有线程都在等待同步锁定。
这里涉及一些统计数据,对println 的一次调用通常不会让你的整个应用程序都被抓取。代码中的println调用越多,两个或更多线程就越有可能等待彼此。
答案 1 :(得分:3)
在任何Java EE应用程序中,可能有多个应用程序都在同一个JVM中运行。只有一个System.out
。如果多个应用程序试图同时写入System.out
,它可能会导致输出争用,理论上可能会影响性能。
此外,虽然不一定与性能相关,但它会使输出非常混乱且难以阅读 - 特别是如果多个应用程序同时写入输出,而没有任何关于输出来自哪个应用程序的指示。 (即使是同一个应用程序中的多个并发请求也是如此。)
正如您所提到的,使用适当的日志记录框架将消除这两个问题。
答案 2 :(得分:0)
还有一点,无论用sysout写的是什么,都会在运行时出现,你无法控制它,它会一直打印。通过使用Logging框架,您可以打开/关闭日志记录。