Chúng tôi có một ứng dụng dựa trên Web Java chạy trên JBoss với kích thước tối đa cho phép là khoảng 1,2 GB (tổng bộ nhớ vật lý máy là 2 GB). Tại một số điểm ứng dụng dừng đáp ứng (cho khách hàng) trong vài phút. Sau khi phân tích một số, chúng tôi phát hiện ra rằng thủ phạm là toàn GC. Dưới đây là một đoạn trích từ nhật ký GC verbose:Toàn thời gian thực GC là nhiều hơn nữa mà người dùng + sys lần
74477,402: [Full GC [PSYoungGen: 3648K-> 0K (332160K)] [PSOldGen: 778476K-> 589497K (819200K)] 782124K-> 589497K (1151360K) [PSPermGen: 102671K-> 102671K (171328K)], 646,1546860 giây] [Times: user = 3,84 sys = 3,72, thực = 646,17 giây]
những gì tôi không hiểu là thế nào là nó có thể là thời gian thực chi tiêu cho toàn GC là khoảng 11 phút (646 giây), trong khi người dùng + sys lần chỉ là 7,5 giây. 7,5 giây âm thanh với tôi nhiều thời gian hợp lý hơn để chi tiêu để làm sạch < 200 MB từ thế hệ cũ. Tất cả thời gian khác đi đâu?
Cảm ơn rất nhiều.
Một cách tiếp cận khác có thể làm giảm các đối tượng tồn tại lâu dài, vì các đối tượng sống ngắn sẽ được tái chế nhanh hơn nhiều. Đối tượng-Tạo nhóm ví dụ là một thực tế không tốt trong Java. –
Đúng. Tôi đã tập trung vào những thứ mà OP có thể làm một cách nhanh chóng để giải quyết vấn đề. –
Bạn có chắc chắn về điều này? Tôi sẽ mong đợi một quá trình JVM chờ đợi một pagein dành thời gian trong sys =. – eckes