2011-12-06 4 views
6

Java 학습을 시작할 때 Java EE 응용 프로그램에서 System.out.println을 수행하지 말라고 들었습니다. 그러나 나는 그렇게하지 않는 이유가 무엇인지 정말로 모른다.Java EE 응용 프로그램의 System.out.println 위험

중요한 사항을 실제로 인쇄해야하는 경우 로깅 프레임 워크를 사용하여 로깅해야한다는 사실을 충분히 알고 있습니다.

내가 정말 여기 물어보고 싶은 것은 :에서 System.out.println이하게것을 어떤 진짜 위험이있다? 성능 문제가 있습니까?

답변

7

실제로 성능 문제가 있습니다. System.out에 대한 JDK 소스 코드를 파고 들면 결과적으로 출력 스트림에서 synchronized 블록이 발생합니다.

즉, 소스 코드에 충분한 println 호출을 넣으면 모든 스레드가 동기화 잠금을 기다리고 있기 때문에 전체 코드 기반이 효과적으로 단일 스레드로 실행됩니다.

여기에 일부 통계가 포함되어 있습니다. println 을 한 번 호출하면 일반적으로이 전체 응용 프로그램을 크롤링하지 않습니다. 코드에서 println 호출이 많을수록 둘 이상의 스레드가 서로를 기다려야 할 가능성이 높아집니다.

3

모든 Java EE 응용 프로그램 내에서 동일한 JVM 내에서 여러 응용 프로그램이 모두 실행될 가능성이 큽니다. 단 하나의 System.out이 있습니다. 여러 응용 프로그램이 동시에 System.out에 쓰려고하면 출력에 경합이 발생할 수 있으며 이론적으로 성능에 영향을 줄 수 있습니다.

또한 성능과 관련이있는 것은 아니지만 출력이 매우 복잡하고 읽기 어려운 경우가 있습니다. 특히 출력이 어느 응용 프로그램에서 발생하는지에 대한 표시없이 여러 응용 프로그램이 동시에 출력을 쓰는 경우 특히 그렇습니다. 동일한 응용 프로그램 내에서도 여러 동시 요청에 대해 동일합니다.

언급 한대로 적절한 로깅 프레임 워크를 사용하면이 두 가지 문제가 모두 제거됩니다.

0

또 하나의 요점은, sysout으로 작성된 모든 것이 런타임에있을 것이며, 제어 할 수 없으며 항상 인쇄됩니다. 로깅 프레임 워크를 사용하여 로깅을 켜고 끌 수 있습니다.

관련 문제