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à
- 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ì?
- 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.
cố gắng cấu hình bằng http://www.yourkit.com/java/profiler/index.jsp – titus
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
các chủ đề đang làm gì? CPU chỉ hoạt động? i/o hoạt động? – TheBronx