2015-03-06 12 views
7

Tôi đang chạy một hệ thống xây dựng. Chúng tôi đã từng sử dụng bộ thu CMS, nhưng chúng tôi bắt đầu chịu đựng dưới các chu kỳ GC đầy đủ, thông lượng (thời gian không thực hiện GC) là khoảng 90%. Vì vậy, bây giờ tôi đã quyết định chuyển sang G1 với giả định rằng ngay cả khi tôi có tổng thời gian GC tổng thể lâu hơn, thời gian tạm dừng sẽ ngắn hơn do đó đảm bảo tính khả dụng cao hơn. Vì vậy, ý tưởng này dường như hoạt động tốt hơn tôi đã expeced, tôi đã thấy không có GC đầy đủ trong gần 3 ngày, thông lượng là 97%, hiệu suất tổng thể của GC là tốt hơn. (Tất cả các ảnh chụp màn hình và dữ liệu nhận được từ GCViewer)Tạm ngừng GC thực sự lâu sau vài ngày

Normal

Cho đến nay (ngày thứ 6). Hôm nay hệ thống chỉ đơn giản là đi berzerk. Không gian cũ được sử dụng chỉ là dưới 100%. Tôi nhìn thấy đầy đủ GC kích hoạt hầu hết 2-3 phút hoặc lâu hơn: Berzerk!

Cũ gian sử dụng: Old space

kích thước Heap là 20G (128g Ram tổng số). Cờ Tôi hiện đang sử dụng là:

-XX:+UseG1GC 
-XX:MaxPermSize=512m 
-XX:MaxGCPauseMillis=800 
-XX:GCPauseIntervalMillis=8000 
-XX:NewRatio=4 
-XX:PermSize=256m 
-XX:InitiatingHeapOccupancyPercent=35 
-XX:+ParallelRefProcEnabled 

cộng khai thác gỗ cờ. Những gì tôi có vẻ là mất tích là -XX:+ParallelGCThreads=20 (Tôi có 32 bộ vi xử lý), mặc định nên được 8. Tôi cũng đã đọc từ oracle rằng nó sẽ được đề nghị để có -XX:+G1NewSizePercent=4 cho 20G đống, mặc định nên được 5.

Tôi đang sử dụng Java HotSpot (TM) Máy chủ 64-Bit VM 1.7.0_76, Tổng công ty Oracle

Bạn sẽ đề xuất điều gì? Tôi có sai lầm rõ ràng không? Điều gì cần thay đổi? Tôi có tham lam bằng cách chỉ cho Java 20G không? Giả định ở đây là cho nó quá nhiều đống sẽ có nghĩa là GC dài hơn vì đơn giản chỉ cần làm sạch hơn (logic nông dân).

PS: Đơn đăng ký không phải của tôi. Đối với tôi nó là một sản phẩm hộp.

+5

Tôi nghĩ rằng có một số rò rỉ bộ nhớ ở đâu đó trong phần mềm của bạn, sẽ từ từ tiêu thụ không gian heap có sẵn, làm cho công việc của GC khó khăn hơn và khó hơn khi thời gian chạy. Vì vậy, giải pháp không phải là để được tìm kiếm trong thuật toán GC hoặc trong các thiết lập heap (mà cuối cùng sẽ điền vào bất kể kích thước của nó). Bạn phải sửa chữa phần mềm của bạn, hoặc sống với thực tế bạn cần phải khởi động lại nó mỗi bây giờ và sau đó. Thật thú vị, có vẻ như heap của bạn sẽ không hoàn toàn lấp đầy, làm hỏng chương trình của bạn, vì vậy có thể tôi chỉ là sai. –

+0

Bạn nên ghi đè nhật ký GC được in bằng '-XX: + PrintGCDetails -XX: + PrintGCTimeStamps -XX: + PrintAdaptiveSizePolicy -Xloggc: ', sẽ hữu ích hơn khi hiểu các quyết định của G1. Nếu bạn có thể thử java 8, G1GC đã trải qua rất nhiều thay đổi kể từ đó. Nhiều người trong số các chẩn đoán của nó đã được cải thiện và một số tắc nghẽn bị loại bỏ. IIRC trong 7 có một vài trường hợp G1 có thể sắp xếp "tự sơn thành một góc" – the8472

+0

Tôi tìm thấy giải pháp, Hệ thống cũng cho phép người dùng thực thi các kịch bản tùy chỉnh trong quá trình xây dựng. Sau một cuộc điều tra (rất dài), hóa ra một người dùng liên tục thực hiện một tập lệnh, không giải phóng bộ nhớ, khiến đường cơ sở heap liên tục tăng lên, do đó chu kỳ GC được giải phóng ít hơn mỗi lần rẽ. –

Trả lời

1

Bạn sẽ đề xuất điều gì? Tôi có sai lầm rõ ràng không? Điều gì cần thay đổi? Tôi có tham lam bằng cách cho Java chỉ 20G không? Giả định ở đây là cho nó quá nhiều đống sẽ có nghĩa là GC dài hơn vì đơn giản chỉ cần làm sạch hơn (logic nông dân).

Nếu nó gây nên đầy đủ các tổng công ty nhưng ở lại công suất ở gần những 20GB sau đó nó có thể là GC đơn giản là không có đủ chỗ thở, hoặc là để đáp ứng nhu cầu phân bổ lớn hoặc hoặc để đáp ứng một số mục tiêu của mình (thông , tạm dừng thời gian), buộc toàn bộ GC làm dự phòng.

Vì vậy, những gì bạn có thể thử là tăng giới hạn heap hoặc thư giãn các mục tiêu thông lượng.

Như đã đề cập trước đó trong nhận xét của tôi, bạn cũng có thể thử nâng cấp lên java8 để cải thiện tính năng chẩn đoán G1.

Để được tư vấn thêm, các bản ghi GC bao gồm hành vi "berzerk" sẽ hữu ích.

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