Tôi có 7 trình tiện ích java khác nhau mà tôi chạy (tất cả 7) trên 3 máy chủ khác nhau. Dòng lệnh java có -Xmx2048m và -Xss1024k. Trên 3 máy chủ này, tất cả 21 quy trình chỉ hiển thị dưới 2,5 GB cho kích thước VIRT ở trên cùng và trên đỉnh. RES kích thước khác nhau từ 300 đến 1,9 GB theo đó daemon nó được.Điều gì sẽ gây ra quá trình java vượt quá giới hạn Xmx hoặc Xss?
Đó là tất cả như mong muốn.
Nhập máy chủ mới. CPU nhanh hơn, RAM nhiều hơn (16 GB thay vì 8 GB), hơi mới hơn java (1.6.0_10-b33 trên các máy chủ cũ, 1.6.0_31-b04 trên máy chủ mới). Cả hai hệ thống (và JVM) đều là 64bit.
Đã chuyển 2 daemon sang máy chủ mới. Trên máy chủ mới, được đưa ra cùng một nhiệm vụ, các trình tiện ích đều tiêu thụ nhiều CPU hơn (về giá trị cốt lõi) và ít được thực hiện hơn. (Đã chuyển từ 5110 bộ vi xử lý trên các hệ thống cũ sang 5620 trên hệ thống mới).
Khá nhiều lõi đầy đủ của việc sử dụng CPU (GC thread ??) và báo cáo 5 GB VIRT và 2 GB RES cho một daemon và 10.5 GB VIRT và 2 GB RES cho daemon khác.
Bất kỳ ý tưởng nào sẽ khiến java bỏ qua (hoặc dường như bỏ qua nếu đúng như vậy) giới hạn bộ nhớ?
VIRT là bộ nhớ ảo, không có mối quan hệ trực tiếp với không gian heap. Tôi khuyên bạn nên đọc câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/4893192/process-memory-vs-heap-jvm –
Bạn đã thử dùng cùng một phiên bản Java trên máy mới chưa? Cả hai đều giống nhau không? –
'Xmx' không chỉ định mức sử dụng bộ nhớ của JVM; nó chỉ định kích thước tối đa của nhóm phân bổ heap, đó chỉ là một trong các vùng nhớ được JVM sử dụng. – skaffman