Опасность System.out.println в приложении Java EE - PullRequest
6 голосов
/ 06 декабря 2011

Когда я начинал изучать Java, мне сказали не делать System.out.println в приложении Java EE. Однако я не знаю, в чём причина того, что я этого не сделал.

Я полностью осознаю, что если нам действительно нужно напечатать важную информацию, она должна регистрироваться с использованием каркаса ведения журнала.

Что я действительно хочу спросить здесь: есть ли реальная опасность , которую System.out.println создают? Это вызывает проблемы с производительностью?

Ответы [ 3 ]

7 голосов
/ 06 декабря 2011

Это действительно проблема производительности.Если вы покопаетесь в исходном коде JDK для System.out, вы в конечном итоге встретите блок synchronized в выходном потоке.

Это означает, что если вы поместите достаточно вызовов println в ваш исходный код, вся база кода будет эффективно выполняться однопоточным, поскольку все потоки ожидают блокировки синхронизации.

Есть некоторыеВ соответствии со статистикой, один вызов println , как правило, , не приведет к полному сканированию всего приложения.Чем больше вызовов println в вашем коде, тем больше вероятность того, что двум или более потокам придется ждать друг друга.

3 голосов
/ 06 декабря 2011

В любом приложении Java EE, вероятно, есть несколько приложений, работающих в одной JVM. Существует только один System.out. Если несколько приложений пытаются одновременно выполнить запись в System.out, это может вызвать конфликт на выходе и теоретически повлиять на производительность.

Кроме того, хотя это не обязательно связано с производительностью, это делает вывод очень запутанным и трудным для чтения - особенно, если несколько приложений записывают вывод одновременно, без каких-либо указаний относительно того, из какого приложения поступает вывод. (То же самое для нескольких одновременных запросов даже в одном приложении.)

Как вы упомянули, использование надлежащей инфраструктуры ведения журналов устранит обе эти проблемы.

0 голосов
/ 06 декабря 2011

Еще один момент, что бы ни написано с помощью sysout, будет там во время выполнения, вы не можете это контролировать, оно будет печататься всегда.Используя Logging Framework, вы можете включить / выключить ведение журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...