2013-07-16 18 views
7

Với điều chỉnh GC Tôi thành công có thể nhận được hiệu suất cho các ứng dụng java thời gian thực và tránh tạm dừng GC có thể nhận ra. Tuy nhiên, điều này giữ tốt lên đến ~ 20 GB không gian heap.Chia tỷ lệ theo chiều dọc của ứng dụng thời gian thực Java

Giảm chi phí phần cứng đã làm cho ngay cả 100 GB RAM máy giá cả phải chăng. Tuy nhiên, vẫn còn với Java do GC tạm dừng, kích thước heap cao hơn như 50 GB có thể gửi cho bạn vào cơn ác mộng vào những thời điểm thường xuyên.

Tôi hiểu rằng có các tùy chọn như off-heap và phân phối-heap. Tuy nhiên, off-heap có một bất lợi của se/derialization và phân phối-heap trên tay tăng chi phí bảo trì. Hơn nữa, trong phân vùng-heap bạn đang thực sự không hoàn toàn sử dụng RAM (nói 64 GB) mà những ngày này đang trở thành phổ biến như hàng hóa.

Do đó, để tận dụng tối đa tiềm năng của RAM, giải pháp tốt cho việc mở rộng quy mô các ứng dụng Java là gì?

+2

"Java ứng dụng thời gian thực" <= lol wut? Bạn thực sự không nên sử dụng Java cho một ứng dụng thời gian thực. Nó chỉ đơn giản là không được thực hiện cho điều đó. –

+2

@stonedsquirrel - đó là một cái nhìn khá hẹp của jvm. có các jvms được nhắm mục tiêu vào các ứng dụng thời gian thực. – jtahlborn

+0

tôi giả sử bạn đang đề cập đến jvm oracle, được nhắm mục tiêu khá nhiều vào "mục đích chung". bạn đã xem xét jvms được thiết kế đặc biệt cho bộ nhớ lớn, như azul? – jtahlborn

Trả lời

5

Tôi đang làm việc trên thư viện bộ sưu tập nguyên thủy có tên là Banana. Chuối giải quyết những vấn đề chính xác. Nó hỗ trợ LinkedLists, HashMaps và các cấu trúc dữ liệu khác có thể sớm mà không cần phải lưu giữ N đối tượng. về cơ bản - toàn bộ lưu trữ có thể nằm bên trong một mảng int [] (hoặc nhiều).

Trong khi tôi chưa chính thức phát hành, hầu hết nó được kiểm tra kỹ và tôi đã chạy thành công trên các máy chủ có RAM 144GB, duy trì hiệu suất nhanh và nhất quán mà không bị tạm dừng GC.

Kiểm tra this điểm chuẩn bản đồ băm để biết ý tưởng về cách sử dụng Banana để lưu trữ dữ liệu và độ phân giải theo chiều dọc.

https://github.com/omry/banana/wiki/Long-to-fixed-size-object-benchmark

Xem wiki để biết thêm.

+0

Cảm ơn bạn đã nhập. Sẽ đi qua nó. Là miễn phí để sử dụng hoặc có một số giấy phép cho sử dụng thương mại. – sky

+0

miễn phí như trong Banana (giấy phép BSD). –

+0

Tôi về cơ bản muốn thấy nó được sử dụng, và hy vọng nhận được một số sự thừa nhận từ người dùng rằng điều này thực sự tuyệt vời như tôi nghĩ, và cũng có thể nói chung là nguồn mở tốt như báo cáo lỗi và đóng góp mã. –

0

Thời gian thu thập rác là một chức năng của số đối tượng trực tiếp trong vùng lưu trữ của bạn. Điều này có nghĩa là nếu tỷ lệ phân bổ của bạn rất cao nhưng số lượng đối tượng trực tiếp luôn thấp, bạn có thể sử dụng nhiều RAM tùy thích mà không bị tạm dừng đáng kể.

Tuyên bố này đặc biệt đúng với Bộ thu thập dữ liệu Troughput (-XX:+UseParallelOldGC).

Nếu bạn sử dụng CMS, thì có thể bạn muốn kiểm tra chế độ gia tăng của nó (-XX:+CMSIncrementalMode). Nó sẽ kích hoạt các chu kỳ CMS nhỏ hơn để làm sạch một phần nhỏ hơn của heap của bạn, trong khi tận dụng phần cứng của bạn và không có STW tạm dừng.

Nếu CMS không phải là một tùy chọn, thì bạn nên có một cái nhìn tại G1 (-XX:+UseG1GC), là một bộ sưu tập rác mới được thiết kế cho đống lớn. Nguyên tắc là: chỉ làm sạch một số khu vực của heap tại mỗi chu kỳ nhưng chắc chắn rằng các khu vực này có chứa rất nhiều đối tượng chết (tăng nhanh).

Hy vọng điều đó sẽ hữu ích!

Nguồn:

0

tôi đã làm một số nghiên cứu về mở rộng quy mô kích thước đống JVM. Bạn có thể đọc thêm chi tiết herehere.

Kết luận chính: GC tạm dừng trẻ có hai thành phần không đổi và thay đổi.

thành phần không đổi phụ thuộc vào kích thước không gian cũ và cho 64GiB, tôi mong đợi nó sẽ là 80ms-120ms (phụ thuộc vào phần cứng).

Thành phần biến phụ thuộc vào sự tồn tại của các đối tượng trong không gian trẻ (do đó nó thay đổi từ bộ sưu tập thành bộ sưu tập). Nó thực sự là ứng dụng cụ thể, nhưng bạn thường có thể giảm nó bằng cách giảm không gian trẻ (với chi phí tạm dừng thường xuyên hơn).

Trong trường hợp của bạn cho 4 GiB không gian trẻ, bạn có 500ms. Giả sử thành phần biến là 400ms, nếu bạn giảm không gian trẻ xuống 1 GiB, bạn nên có ~ 200ms tạm dừng (nhưng 2 lần mỗi giây).

Một cách tiếp cận khác là sử dụng nhiều lõi CPU hơn, song song GC trẻ extremely well.

0

G1 và Shenandoah (thử nghiệm) thu gom rác cung cấp độ đàn hồi tuyệt vời và mở khóa mở rộng dọc cho các ứng dụng Java tối ưu hóa sử dụng bộ nhớ theo tải hiện tại. Chi tiết cụ thể như thế nào nó hoạt động đang ở bài viết Minimize Java Memory Usage with the Right Garbage Collector

Java Elastic in Containers

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