2013-01-23 26 views
6

Như được thấy bên dưới, ở giữa mọi thứ hoạt động như dự kiến ​​hoạt động GC dừng lại trên thế giới mất +60 giây. Nó có thể được xác định là ngăn chặn thế giới trong toàn bộ thời gian, bởi vì các khách hàng (đất nung) bị bỏ rơi, phàn nàn nó (máy chủ đất nung) đã không phản hồi trong thời gian đó.Dài JVM phút GC

Đây là GC trẻ/nhỏ? Nếu có, nó có thể là do nạn đói trong thế hệ trẻ (eden + survivors?).

Chỉ 109333 (KB) miễn phí?

Tôi sẽ bắt đầu vẽ đồ thị các vùng chứa bộ nhớ khác nhau, bất kỳ đề xuất nào khác có thể được thực hiện để chẩn đoán thêm các vấn đề như thế này?

date, startMem=24589884, endMem=24478495, reclaimed=111389, timeTaken=0.211244 (1172274.139: [GC 24589884K->24478495K(29343104K), 0.2112440 secs]) 
date, startMem=24614815, endMem=24505482, reclaimed=109333, timeTaken=61.301987 (1172276.518: [GC 24614815K->24505482K(29343104K), 61.3019860 secs]) 
date, startMem=24641802, endMem=24529546, reclaimed=112256, timeTaken=2.68437 (1172348.921: [GC 24641802K->24529546K(29343104K), 2.6843700 secs]) 

Sun JVM là 1.6, sử dụng các cấu hình sau:

-Xms28672m -Xmx28672m -XX: + UseConcMarkSweepGC -XX: + PrintGCTimeStamps -XX: + PrintGC

Sane điều chỉnh cấu hình để gỡ lỗi thêm GC:

'-XX:+PrintGCDateStamps' Print date stamps instead of relative timestamps 
'-XX:+PrintGCDetails' Will show what cpu went for (user, kern), gc algorithm used 
'-XX:+PrintHeapAtGC' will show all of the heaps memory containers and their usage 
'-Xloggc:/path/to/dedicated.log' log to specific file 
+0

Ứng dụng của bạn đang làm gì? GC jitter xảy ra khi số lượng lớn bộ nhớ đang được khai hoang từ đống trong nhiều lần quét, có khả năng là mỗi lần quét sẽ khiến nhiều đối tượng trở nên đủ điều kiện để thu thập, dẫn đến việc quét thêm. Ngay cả khi bạn chạy chương trình thứ hai, bạn vẫn có một khoảng thời gian rất lớn để GC thực hiện. Tôi nghĩ bạn sẽ thấy thay đổi cách ứng dụng của bạn đang xử lý các đối tượng, thay vì cấu hình JVM sẽ là đường dẫn bạn cần thực hiện. Bất kỳ ứng dụng nào cần giữ GC jitter xuống đều đang tìm cách sử dụng lại thay vì phải tái phân bổ các đối tượng. – codeghost

+0

Đó là một phiên (cookie) lưu trữ. Các con số, ví dụ "khai hoang" cho thấy không có nhiều bộ nhớ thực sự được khai hoang. Nếu vậy nó khá thuận tiện để biết tại sao. Tôi đồng ý với bạn đầy đủ rằng nó cần phải được giải quyết trong cách xử lý các đối tượng (session), những gì chúng chứa ... Có một quá trình để xử lý các phiên tốt hơn, nhưng hiện tại tôi có công việc để tìm hiểu tại sao GC sẽ mất +60 giây và vẫn không có nhiều bộ nhớ hơn so với 0,2 giây trước đó. – user135361

+2

Hãy xem blog này http://kirk.blog-city.com/why_do_i_have_this_long_gc_pause.htm có thể cung cấp cho bạn một vài gợi ý. – codeghost

Trả lời

1

-XX:+UseConcMarkSweepGC phép bộ sưu tập đồng thời

Default Vs. CMS

Tổng thời gian thực hiện là tổng của giai đoạn stop-the-thế giới (JVM bị chặn) và giai đoạn đồng thời (JVM thực thi mã người dùng).

Bạn nên bật ghi nhật ký GC chi tiết để điều tra thêm, vì bạn không có thông tin về số lượng +60 giây đó đang chặn JVM.

+0

Tôi đã vạch ra rằng đầu ra dài dòng hơn sẽ được ghi lại. Câu hỏi không phải là cách CMS hoạt động, mà là trong hoàn cảnh nào thì một thế giới dừng chân dài sẽ xảy ra. JVM đã bị chặn toàn bộ thời gian, do đó, nó là một "GC lớn" và có khả năng do chống phân mảnh. Nếu vậy, câu hỏi là làm thế nào tôi có thể biết nếu thêm heap hơn sẽ giúp đỡ, hoặc trong những trường hợp sẽ lập kế hoạch cms đá trong trợ giúp trước đó. Tôi đánh giá cao nỗ lực của bạn, nhưng bạn sẽ phải mất một đâm vào cô lập các yếu tố trước khi tôi upvote bạn. – user135361

+2

Làm thế nào để bạn biết JVM đã bị chặn toàn bộ thời gian mà không cần đăng nhập chi tiết? Bạn nên thêm vào câu hỏi tất cả thông tin bạn có. – fglez

+0

điểm tốt, cập nhật. – user135361

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