2013-02-15 32 views
10

Tôi đang chạy một chương trình Java trên máy tính xách tay Core i7 có 8 lõi (4 vật lý, 4 HT). Chương trình sử dụng 8 luồng song song và vì vậy nó nên sử dụng hết tất cả CPU. Khi chạy với tham số '-server', nó luôn ở mức 100%. Nếu không có nó, khoảng 50% -60% tổng thể (luôn thay đổi với các đỉnh ở 100% và giảm xuống 30%). Dưới đây là những gì tôi thấy lạ: khi tôi chạy chương trình trong gỡ lỗi và chờ một chút thời gian sử dụng CPU đặc biệt thấp (30%) và sau đó tạm ngừng thực hiện để xem 8 chủ đề đang làm gì, không ai trong số đó đang ở trạng thái chặn . Hơn nữa, hầu như không có sự đồng bộ hóa giữa chúng. Dưới đây là những gì tôi đang tự hỏi:Việc sử dụng CPU Java phải là 100% ... nhưng không phải là

  1. Sự khác nhau giữa máy chủ và máy khách có thể ngăn CPU đạt 100% trong ứng dụng khách là gì?
  2. Trong trường hợp không đồng bộ hóa, điều gì có thể giữ cho luồng chỉ sử dụng hết lõi? (có thể được liên kết với 1)

Chỉnh sửa: Đây là một ý tưởng: mã phân bổ mảng lớn và để chúng vào GC khá nhanh chóng. Có một thread ngủ khi gọi 'mới SomethingBig()' và phân bổ bộ nhớ đó cần có thời gian? Nếu có một quá trình duy nhất trong phân phối xử lý VM cho một loạt các chủ đề, tôi đoán rằng có thể giải thích lý do tại sao họ dường như tạm dừng một cách ngẫu nhiên, bên ngoài khối đồng bộ ...

Edit2: Tôi chắc chắn nó là do GC hiện nay. CPU đạt 100% một lần nữa nếu tôi cung cấp cho máy ảo 1500Mb thay vì 500Mb mặc định. Tôi nghĩ rằng sự chậm lại không xảy ra ở chế độ máy chủ vì nó sử dụng nhiều bộ nhớ hơn theo mặc định.

+2

cố gắng cấu hình bằng http://www.yourkit.com/java/profiler/index.jsp – titus

+0

bản sao có thể có của [Sự khác biệt thực sự giữa "máy chủ java" và "java -client"?] (Http: //stackoverflow.com/questions/198577/real-differences-between-java-server-and-java-client) – Perception

+0

các chủ đề đang làm gì? CPU chỉ hoạt động? i/o hoạt động? – TheBronx

Trả lời

2

Nếu bạn muốn theo dõi những gì các chuỗi Java đang làm, bạn không nên chạy ứng dụng ở chế độ gỡ lỗi và tạm dừng nó.

Thay vào đó, bạn nên thu thập các bãi chuỗi với kill -3 <pid> trong khoảng thời gian cụ thể khi mức sử dụng CPU giảm xuống.

Liên quan đến bản cập nhật thứ hai, bạn nên bật ghi nhật ký GC với dấu thời gian và tương ứng với mức giảm/sử dụng CPU giảm theo thời gian của bộ sưu tập GC/Young.

3

Không liên quan đến Java cụ thể, nhưng số lượng chủ đề bạn phải nhiều hơn số lõi bạn phải tận dụng tối đa CPU của bạn, điều này là do có nhiều lần khi một chuỗi cụ thể không thể thực thi, cũng như sự chờ đợi rõ ràng hơn trên biến điều kiện được giữ bởi một luồng khác, luồng có thể bị chặn vì các lý do khác cũng giống như một bộ nhớ cache bỏ lỡ có thể yêu cầu luồng chờ dữ liệu được nạp vào bộ nhớ cache cpus, nó có thể phải đợi đầu vào từ một số nguồn chậm hơn CPU, việc phân trang bộ nhớ hầu như có thể khiến cho chuỗi của bạn phải chờ. Bởi có nhiều chủ đề hơn bạn có cốt lõi, khi một sợi bị chặn vì lý do nào, lý do khác có thể sử dụng lõi đó được giải phóng. Một giá trị ban đầu tốt là khoảng 1,5 X số lõi bạn có.

+1

Trong trường hợp này các chủ đề chủ yếu là không đồng bộ. Tôi đã thử nhiều chủ đề hơn và không có sự khác biệt trong việc sử dụng CPU. Và theo cách tổng quát, nếu bạn có nhiều luồng hơn lõi, hiệu năng sẽ bắt đầu giảm khi CPU sẽ liên tục chuyển đổi giữa chúng, tôi tin. – schmop

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