Tôi có một ứng dụng Java có khối lượng lớn xử lý tải nhất quán 50000msgs/giây. Nó được điều chỉnh cho thông lượng cao bằng cách sử dụng các cài đặt sau:Tại sao thời gian GC tăng đều đặn trên một ứng dụng Java có khối lượng lớn chạy dài?
-Xmx3g -Xms3g -XX: NewSize = 2g -Xss128k -XX: SurvivorRatio = 6 -XX: TargetSurvivorRatio = 90 -XX: + UseParallelGC -XX: ParallelGCThreads = 12 -XX: + UseParallelOldGC -XX: + HeapDumpOnOutOfMemoryError
Tôi thấy rằng thời gian GC trẻ tăng đều từ 50ms khi nó bắt đầu 200ms vào cuối ngày, mặc dù tần số GC vẫn giữ nguyên.
Nếu tôi thử chạy tương tự bằng cách sử dụng bộ thu ParNewGC, thời gian GC tăng lên với tốc độ nhanh hơn nhiều. Có ai có bất kỳ suy nghĩ về vấn đề này?
Ngày càng tệ hơn vào ngày hôm sau, tức là bạn sẽ khởi động lại ứng dụng nhiều hơn 200 m mỗi ngày? – JoseK
Một dự đoán, nhưng không phải đây chỉ là một tác dụng phụ của NewSize thực sự lớn? GC-ing trên 2 gig của các đối tượng có vẻ như nó sẽ mất một thời gian. – wds