2011-12-28 37 views
10

Tôi đã lược tả ứng dụng của mình bằng cách sử dụng JProfiler và kết quả là, trong phần "Chế độ xem CPU", nó cho thấy hơn 40% thời gian CPU được sử dụng trên Object.wait(). Tuy nhiên theo như tôi biết trên Object.wait() CPU không được đưa ra cho chuỗi chờ.Sử dụng CPU và Object.wait

Ai đó có thể giúp hiểu những gì đang xảy ra và tại sao trình bày hồ sơ cho thấy rằng phần lớn CPU này được chi tiêu trên Object.wait()?

+0

Bạn đang sử dụng nhiều chủ đề hay chỉ một chủ đề? đây có phải là ứng dụng GUI hay máy chủ không? – Kylar

+0

Đây là một ứng dụng không phải GUI, chứa nhiều luồng - từ 40 đến 60 luồng. Một số chủ đề đang đợi mạng I/O và một số khác đang chờ để trả lời các yêu cầu nhận được sử dụng I/O. – Faramarz

Trả lời

6

Trình thu thập thông tin không biết rằng CPU không hoạt động trong khi đang ở wait(). Tất cả những gì profiler biết là wait() đã được nhập, và vài phần nghìn giây sau nó trở lại. Vì vậy, nếu những mili giây đó có xu hướng chiếm 40% thời gian thực hiện của bạn, thì bạn có nó.

+0

Phụ thuộc vào hồ sơ. Ví dụ, YourKit chắc chắn biết để đo thời gian CPU: http://www.yourkit.com/docs/10/help/times.jsp –

+0

@EliAcherkan Có, và tôi thậm chí không biết chắc chắn rằng jprofiler không biết điều đó; nhưng không có lời giải thích nào khác. Điều duy nhất tôi có thể suy đoán là nếu bạn có một luồng trong một vòng lặp chặt chẽ không làm gì ngoài 'wait()' và một luồng khác trong một vòng lặp chặt chẽ không làm gì ngoài 'notify()' thì tôi cho rằng nó có khả năng là 'đợi() 'trong thực tế sẽ tiêu thụ một tỷ lệ phần trăm lớn của CPU, không phải vì nó là đắt tiền trong và của chính nó, nhưng bởi vì chúng tôi sẽ không thực sự được làm bất cứ điều gì khác. Nhưng điều đó rất khó xảy ra. –

2

40% số tiền? Giả sử bạn cấu đoạn mã sau:

for (i = 0; i < 1000; i++){ 
    sleep(1); 
} 

Nếu bạn chỉ nhìn thời gian CPU (không phải thời gian tường đồng hồ), gần như tất cả của nó sẽ được ở sleep.

Tại sao? Bởi vì nó sử dụng rất ít thời gian CPU, nhưng thời gian của CPU, nó sử dụng, thực sự tất cả đều được dùng vào và để lại sleep.

Tất nhiên, nếu bạn nhìn vào đồng hồ treo tường, thậm chí nhiều hơn nó sẽ ở trong sleep.

Tương tự với mọi cuộc gọi chặn, như wait.

+0

Cảm ơn mọi người. Tôi sẽ thử một hồ sơ khác như YourKit để xem nó nói gì với tôi. – Faramarz