Đã vượt quá giới hạn tổng chi phí GC


93

Thời gian lấy mẫu mà JVM sử dụng để ném 'java.lang.OutOfMemoryError: Đã vượt quá giới hạn chi phí GC'? Tôi biết bạn có thể kiểm soát 98% và 2% với các tham số GCTimeLimit và GCHeapFreeLimit nhưng thời gian lấy mẫu là bao nhiêu?

Câu trả lời:


82

Từ Java SE 6 HotSpot [tm] Điều chỉnh thu thập rác trên máy ảo

sau đây

Quá thời gian GC và OutOfMemoryError

Bộ thu gom đồng thời sẽ ném OutOfMemoryError nếu dành quá nhiều thời gian cho việc thu gom rác: nếu hơn 98% tổng thời gian được dành cho việc thu gom rác và dưới 2% đống được khôi phục, một OutOfMemoryError sẽ được ném ra. Tính năng này được thiết kế để ngăn không cho các ứng dụng chạy trong một khoảng thời gian dài mà vẫn tiến triển rất ít hoặc không đạt được do đống quá nhỏ. Nếu cần, có thể tắt tính năng này bằng cách thêm tùy chọn -XX: -UseGCOverheadLimit vào dòng lệnh.

Chính sách giống như chính sách trong bộ sưu tập song song, ngoại trừ thời gian dành cho việc thực hiện bộ sưu tập đồng thời không được tính vào giới hạn 98% thời gian. Nói cách khác, chỉ những bộ sưu tập được thực hiện trong khi ứng dụng bị dừng mới được tính vào thời gian GC quá mức. Các bộ sưu tập như vậy thường do lỗi chế độ đồng thời hoặc một yêu cầu thu thập rõ ràng (ví dụ: lệnh gọi đến System.gc ()).

kết hợp với một lối đi xa hơn xuống

Một trong những cách sử dụng thu gom rác rõ ràng thường gặp nhất xảy ra với tính năng thu gom rác phân tán RMI (DGC). Các ứng dụng sử dụng RMI tham chiếu đến các đối tượng trong các máy ảo khác. Không thể thu gom rác trong các ứng dụng phân tán này mà không thỉnh thoảng thu gom đống cục bộ, vì vậy RMI buộc thu thập đầy đủ theo định kỳ. Tần suất của các tập hợp này có thể được kiểm soát bằng các thuộc tính. Ví dụ,

java -Dsun.rmi.dgc.client.gcInterval=3600000

-Dsun.rmi.dgc.server.gcInterval=3600000 chỉ định thu thập rõ ràng một lần một giờ thay vì tốc độ mặc định là một lần một phút. Tuy nhiên, điều này cũng có thể khiến một số đối tượng mất nhiều thời gian hơn để lấy lại. Các thuộc tính này có thể được đặt cao như Long.MAX_VALUE để làm cho thời gian giữa các bộ sưu tập rõ ràng là vô hạn, nếu không muốn giới hạn trên về tính kịp thời của hoạt động DGC.

Có vẻ như ngụ ý rằng khoảng thời gian đánh giá để xác định 98% dài một phút, nhưng nó có thể được cấu hình trên JVM của Sun với định nghĩa chính xác.

Tất nhiên, có thể diễn giải khác.


5
Thu gom rác phân tán RMI là một hoạt động không liên quan đến việc thu gom rác thông thường. Vì vậy, tôi không thấy làm thế nào bạn có thể suy luận những gì bạn vừa làm.
Stephen C

2
Suy luận không hoàn hảo hoặc thậm chí đúng, đó là lý do tại sao "dường như ngụ ý" được sử dụng thay cho "ngụ ý". Nếu bạn đồng ý với nhận xét rằng nếu những người ở Sun sử dụng một phút để xác định khoảng thời gian thu gom rác cho RMI, thì thời gian thu gom rác đồng thời đó chỉ được tính toán khi chương trình chính tạm dừng và tạo ra một bước nhảy vọt về niềm tin , thì tỷ lệ cược tốt là 98% được thu thập trong vòng một phút. Đó là một con số kỳ diệu, nhưng một phút là một con số kỳ diệu thường được sử dụng để so sánh với 3,5 phút.
Edwin Buck

@StephenC làm bạn có nghĩa là ngay cả khi chúng tôi đặt -XX:+DisableExplicitGC nó sẽ không ảnh hưởng đến cấu hình liên quan RMI và hệ thống sẽ gọi gc trong tập tần số với tham số-Dsun.rmi.dgc.server.gcInterval
Steephen

1
@Steephen - Không. Đó không phải là những gì tôi đang nói. Tôi đang nói về câu nói này: "Có vẻ như ngụ ý rằng khoảng thời gian đánh giá để xác định 98% là một phút ..." . Và lưu ý rằng Edwin đồng ý rằng suy luận là "không hoàn hảo". Suy luận dựa trên giả định rằng những người Mặt trời thực hiện RMI (& DGC) đã liên lạc chặt chẽ với những người thực hiện cơ chế giới hạn tổng chi phí GC. Tôi nghi ngờ rằng hai diễn biến thực sự đã xảy ra vào những thời điểm khác nhau. Lưu ý rằng thuộc -Dsun.rmi.dgc.server.gcIntervaltính đã có từ Java 1.2.
Stephen C

1
Dù sao, một cách tiếp cận tốt hơn để tìm ra câu trả lời thực sự cho câu hỏi này là xem mã nguồn OpenJDK.
Stephen C
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.