Chúng tôi đang chạy một ứng dụng Java đôi khi "đóng băng" vì một số luồng đang sử dụng gần như tất cả các đống. Mặc dù JVM làm Full GC kéo dài hơn 60 giây nhưng ứng dụng không bao giờ chết với OutOfMemoryError.Khi chính xác là JVM đang ném một OutOfMemoryError
tôi đọc từ tài liệu Java:
Các nhà sưu tập thông sẽ ném một ngoại lệ out-of-bộ nhớ nếu quá nhiều thời gian đang được chi tiêu làm thu gom rác thải. Ví dụ, nếu JVM đang chi tiêu hơn 98% tổng thời gian thực hiện thu gom rác và đang phục hồi dưới 2% của đống, nó sẽ ném ra một bộ nhớ hết hạn.
Tôi muốn biết thêm thông tin về 98% thời gian này (khung thời gian là gì?), Và nếu có thể hạ thấp giá trị này, tức là ném OOME nếu ứng dụng đang chi tiêu 90% thời gian trong GC và không thể miễn phí nhiều hơn 10% của heap.
Mục đích là để đảm bảo ứng dụng sẽ chết (thay vì chỉ chạy GC) với OOME để chúng tôi có thể tạo một kết xuất trên OOME.
Dưới đây là các thiết lập bộ nhớ và GC chúng tôi sử dụng (OS là Solaris):
-Xms2048m -Xmx2048m \
-Xmn512m \
-XX:PermSize=256m
-XX:MaxPermSize=256m \
-XX:+UseParNewGC
-XX:ParallelGCThreads=16 \
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled \
-XX:+DisableExplicitGC \
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps \
-XX:+PrintClassHistogram \
-Xloggc:/gcmonitor.log \
-XX:+HandlePromotionFailure \
-XX:SurvivorRatio=4
-XX:TargetSurvivorRatio=90
-XX:MaxTenuringThreshold=10 \
-XX:+UseTLAB
-XX:TLABSize=32k
-XX:+ResizeTLAB \
-XX:+UseMPSS \
Nhờ câu trả lời của bạn và câu hỏi mà bạn đã chỉ cho tôi tại tôi thấy tài nguyên sau: http://docs.oracle.com/ javase/1.5.0/docs/guide/vm/gc-ergonomics.html Tôi sẽ thử và gửi phản hồi. – neirda