2011-12-06 32 views
6

Khi tôi bắt đầu nghiên cứu Java, tôi đã được yêu cầu không thực hiện System.out.println trong ứng dụng Java EE. Tuy nhiên tôi không thực sự biết lý do của việc không làm như vậy.Nguy hiểm System.out.println trong ứng dụng Java EE

Tôi hoàn toàn nhận thức được rằng nếu chúng ta thực sự cần in một bản ghi quan trọng, nó phải được ghi lại bằng khung ghi nhật ký.

Điều tôi thực sự muốn hỏi ở đây: có bất kỳ nguy hiểm thực sự rằng System.out.println thực hiện? Nó có gây ra bất kỳ vấn đề hiệu suất nào không?

Trả lời

7

Đây thực sự là vấn đề về hiệu suất. Nếu bạn đào sâu vào mã nguồn JDK cho số System.out, cuối cùng bạn sẽ gặp một khối synchronized trên luồng đầu ra.

Điều đó có nghĩa là nếu bạn đặt đủ các lệnh gọi println trong mã nguồn, toàn bộ cơ sở mã sẽ chạy một luồng có hiệu quả vì tất cả các chuỗi đang chờ khóa đồng bộ hóa.

Có một số số liệu thống kê liên quan ở đây, một cuộc gọi đến println thường là sẽ không đưa toàn bộ ứng dụng của bạn thu thập thông tin. Các cuộc gọi println hơn trong mã của bạn, nhiều khả năng hai hoặc nhiều chủ đề sẽ phải chờ đợi cho nhau.

3

Trong bất kỳ ứng dụng Java EE nào, có khả năng nhiều ứng dụng đang chạy trong cùng một JVM. Chỉ có một số System.out. Nếu một số ứng dụng đang cố gắng ghi vào System.out cùng một lúc, nó có thể gây ra tranh chấp về đầu ra, và về mặt lý thuyết có thể tác động đến hiệu suất. Ngoài ra, mặc dù không nhất thiết phải liên quan đến hiệu năng, nó làm cho đầu ra rất lộn xộn và khó đọc - đặc biệt nếu nhiều ứng dụng đang viết đầu ra cùng một lúc, mà không có bất kỳ dấu hiệu nào cho ứng dụng nào xuất ra. (Giống nhau cho nhiều yêu cầu đồng thời trong cùng một ứng dụng.)

Như bạn đã đề cập, việc sử dụng khung đăng nhập thích hợp sẽ loại bỏ cả hai vấn đề này.

0

Một điểm nữa, bất cứ điều gì được viết bằng sysout sẽ có tại thời gian chạy, bạn không thể kiểm soát nó, nó sẽ in luôn. Bằng cách sử dụng khung công tác Ghi nhật ký, bạn có thể bật/tắt để ghi nhật ký.

Các vấn đề liên quan