2010-06-01 28 views
14

Tôi có một chương trình lớn trong Java sử dụng đa luồng. Trong một số trường hợp, chương trình bắt đầu sử dụng 100% ba lõi của hệ thống tám lõi của tôi. Trong sử dụng bình thường, chương trình sử dụng tất cả các lõi ở mức 1-2%. Làm thế nào tôi có thể tìm thấy các lớp đó là quá tải lõi?Làm cách nào để tìm lớp học chuyên sâu về CPU trong Java?

+2

Nói chung, một lớp không quá tải máy của bạn, một phương pháp cụ thể có thể là. – Uri

Trả lời

1

Thử lấy chuỗi đề xuất (xem jps, lệnh jstack) và sau đó xem phương thức nào được thực thi.

+0

Chỉ cần xem các phương pháp nào được thực hiện thường xuyên nhất không giống như tìm ra nơi chương trình dành hầu hết thời gian xử lý của nó. – Jesper

+0

@Jesper: Thực hiện điều này một số lần như 10, sau đó tìm kiếm các câu lệnh trên nhiều mẫu ngăn xếp. Sau đó, phần của các mẫu chứa một dòng là phần thời gian mà dòng đó chịu trách nhiệm và sẽ không được chi tiêu nhưng cho dòng đó. Khái niệm "nơi chương trình dành thời gian của mình" bỏ qua trách nhiệm của các cuộc gọi phương thức gây ra thời gian để chi tiêu ở các cấp thấp hơn. –

+0

@Mike Quan điểm của tôi là bạn nên đo lượng thời gian được sử dụng trong các phần của chương trình, không chỉ bao nhiêu lần các phương thức được gọi. Bạn có thể có một phương thức được gọi là 1.000 lần nhưng chỉ sử dụng 10% thời gian, hoặc một phương thức được gọi là 100 lần nhưng sử dụng 90% thời gian của chương trình. Để tối ưu hóa, bạn phải tập trung vào phương pháp ít được gọi hơn trong trường hợp này. – Jesper

15

Sử dụng một hồ sơ như jvisualvm mà đi kèm với jdk-1.6.0_10

+2

Bạn có thể muốn tìm vòng lặp chờ bận : '(while! done) {}'. Hiếm khi một chuỗi được viết chính xác sẽ làm việc có ý nghĩa ở 100%, thường tính toán đôi khi bị chặn bởi I/O hoặc đồng bộ. - một đồ thị sử dụng CPU tốt nên trông hơi lượn sóng. – Justin

4

Sử dụng một hồ sơ để tìm ra chủ đề (s) đang sử dụng tất cả các chu kỳ CPU của bạn, và các phương pháp (s) mà họ đang thực thi.

2

Nếu bạn đang đi tuyến đường profiler thương mại thì tôi khuyên bạn nên sử dụng Dynatrace.

+0

Vô lý tốn kém cả về mặt tài chính và về chi phí. http://williamlouth.wordpress.com/2010/05/25/the-java-application-performance-management-vendor-showdown/ –

+0

Tôi không chắc là đắt tiền thế nào nhưng tôi thấy nó hữu ích hơn JProbe .Dynatrace đường dẫn tinh khiết rất kỹ lưỡng và phá vỡ các báo cáo xuống độc đáo ở cấp độ phương pháp, mức sql, cấp api. Bạn có thể sử dụng trình lược tả ứng dụng khách để xem thực thi tập lệnh java, thời gian cuộc gọi ajax, thời gian hiển thị, thời gian mạng. Tôi chắc chắn nó có thể có giá. Đó là lý do tại sao tôi nói nếu OP chi tiêu số tiền để có được một thương mại, ông có thể kiểm tra xem nó ra. – CoolBeans

1

Nếu bạn đang sử dụng Java trên UNIX hoặc một số phiên bản Linux nhìn vào DTrace với Java.

+0

Trên thực tế, các đầu dò dtrace cho JVM khá tốn kém khi chạy. Đầu dò OpenCore so với Đầu dò Java DTrace http://opencore.jinspired.com/?page_id=190 –

6

Giải pháp tốt nhất là sử dụng một hồ sơ - đó là những gì họ đang xây dựng cho, và có một tuyệt vời đi kèm với Java 6.

khác (xa là như lý tưởng một giải pháp) là để chạy chương trình của bạn trong IDE Eclipse (nếu đó là những gì bạn sử dụng) trong chế độ gỡ lỗi. Sau đó, bạn có thể xem các chuỗi đang chạy. NẾU nhiều người trong số họ bị đình chỉ, một trong đó không phải là thủ phạm của bạn. Buộc nó để phá vỡ (từ thanh công cụ) và bạn có thể nhìn thấy nó ở đâu. Có rất nhiều cơ hội mà bạn sẽ tìm thấy một vòng lặp rõ ràng hoặc chờ đợi bận rộn.

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