2012-01-18 29 views
15

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 \ 

Trả lời

4

Tôi muốn biết thêm thông tin về điều này 98% phương tiện thời gian (khung thời gian là bao nhiêu?)

Trả lời cho câu hỏi này: GC overhead limit exceeded đề xuất là 1 phút.

có thể làm giảm giá trị này

Một lần nữa nhìn vào câu hỏi nêu trên, có vẻ như bạn có thể sử dụng GCTimeLimitGCHeapFreeLimit tham số.

+0

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

3

Nếu bạn chỉ tìm cách để buộc một oom để có được những lợi ích phụ của các đống đổ, bây giờ bạn có thể làm điều này trên một quá trình java chạy bất cứ lúc nào:

Tìm quá trình:

JPS -v

Buộc một bãi chứa

jmap -dump: file = heap.bin

Sau đó phân tích heap.bin trong công cụ bạn chọn.

0

Lấy một vùng heap tương tác trên OOME hoặc với jmap có thể khiến JVM tạm dừng trong vài phút. Nó thường hiệu quả hơn để sử dụng gcore để tạo ra một bãi chứa lõi bằng tay, sau đó sử dụng jmap để lấy đống từ lõi.

Tôi muốn phân bổ nhiều heap hơn, xem liệu điều đó có giúp giảm thiểu sự cố không.Ngoài ra, hãy cẩn thận về việc điều chỉnh GC quá mức - thông thường các nhà sưu tập có các giá trị mặc định tuyệt vời, tôi chỉ khuyên bạn nên sử dụng các tùy chọn sau Xloggc nếu bạn đã xác định rằng cải thiện đáng kể hiệu suất GC dựa trên các mẫu phân bổ/lưu giữ đối tượng của ứng dụng của bạn. Các luồng thu song song cũng có thể quá cao, tùy thuộc vào số lượng các luồng phần cứng có sẵn.

Bạn có thể xác định mẫu cho việc sử dụng đống từ nhật ký GC và xác định xem điều này có sử dụng nhanh chóng bằng một luồng đơn hay không, thực hiện thao tác nhanh chóng loại bỏ vùng heap, hoặc mẫu 'rò rỉ' chậm hơn các đối tượng được quảng bá theo thời gian khiến cho thế hệ được thuê phải được tranh luận, với ít đối tượng ứng cử viên cho việc thu thập - biểu đồ cũng sẽ giúp ích.

Tất cả những gì đã nói, tập trung vào một bãi chứa đống chắc chắn là con đường để đi. Eclipse MAT là công cụ phân tích IMO tốt nhất. Dưới đây là một nơi tuyệt vời để bắt đầu nếu bạn chưa sử dụng nó trước:

http://kohlerm.blogspot.com/2009/07/eclipse-memory-analyzer-10-useful.html

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