2012-06-24 43 views
13

Chúng tôi có một ứng dụng web chạy Java 6, Tomcat 6, Spring Framework 3, Hibernate 4, EhCache. Chúng tôi gặp sự cố với thời gian thu gom rác cực dài có thể mất 30 giây hoặc lâu hơn, khiến ứng dụng không phản hồi.Thời gian thu gom rác cực dài

Hiện tại chúng tôi đang thử nghiệm nhưng ngoài sự rõ ràng: thêm bộ nhớ nhiều hơn, tôi đã tự hỏi liệu có những khía cạnh nào chúng tôi có thể điều chỉnh để giảm thời gian thu gom rác hay không.

Đóng góp chính cho việc sử dụng bộ nhớ là EHCache vì chúng tôi đang lưu trữ bộ nhớ mạnh. Nhưng tôi luôn thấy khó có thể kích thước các cửa hàng EHCache (các cửa hàng kích thước byte EhCache mới, dẫn đến tất cả các loại vấn đề với chúng tôi vì các đồ thị đối tượng được lưu trữ có thể khá lớn).

Đây là những thiết lập của tôi cho JVM

JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC 
+0

Bạn có nhận được những thời gian dài này trước khi bộ nhớ đạt tối đa 704MB không? Các JVM có thể là một chút "tích cực" trong cố gắng để giảm bộ nhớ được sử dụng (và có thể di dời nó) trước khi quyết định tăng bộ nhớ được sử dụng. Liệu nó có hoạt động theo cùng một cách nếu bạn sử dụng -Xms704m -Xmx704m bắt đầu không? –

+0

Sử dụng "jstat -gc 1s pid" bạn có thể xem liệu mức sử dụng bộ nhớ của bạn có chạm vào các vườn ươm hay không hoặc nếu việc cấp phát bộ nhớ giữa các vườn ươm, eden và cũ phải được thay đổi. –

+1

Viết tắt hồ sơ của bạn với JProdilfer/Yourkit, bạn sẽ không có bất kỳ đề xuất vững chắc nào. –

Trả lời

3

Để giảm thời gian GC, điều tốt nhất bạn có thể làm là sử dụng tắt bộ nhớ heap. Nếu bạn có thể di chuyển càng nhiều dữ liệu lớn càng tốt, bạn có thể giảm thời gian GC đầy đủ xuống còn 10 milli-giây ngay cả với 100s MB bộ nhớ heap tắt. Tôi tin rằng Ehcache hỗ trợ kho lưu trữ dữ liệu heap, nhưng nếu nó không hoặc bạn không thể sử dụng nó tôi đề nghị bạn xem xét lựa chọn thay thế mà làm.

Do bạn chỉ có kích thước bộ nhớ tối đa 700 MB, có vẻ như bạn đang chạy trên máy chủ có bộ nhớ rất hạn chế. Nếu không, tôi sẽ đề nghị bạn bắt đầu với tối đa là 8 hoặc 16 GB và giảm kích thước bộ nhớ nếu bạn tin rằng bạn không thực sự cần nó.

+0

Kích thước bộ nhớ không phải là vấn đề trong thời gian GC. Chỉ số đối tượng được tạo trước khi bắt đầu GC. – user2763361

+1

@ user2763361 Số lượng đối tượng là rất quan trọng và các yếu tố khác như số tham chiếu hte và tạo ra các tham chiếu đó, nhưng nó là kích thước bạn có thể thấy trong các công cụ giám sát.Nếu bạn giảm bộ nhớ tiêu thụ, bạn có thể cải thiện hiệu suất vì điều này thường có nghĩa là giảm số lượng đối tượng và số lượng tham chiếu. Tóm lại, bạn đúng, nhưng việc sử dụng bộ nhớ dễ đo hơn. –

+0

Cũng nói. Liên quan: http://stackoverflow.com/questions/21675709/how-to-find-which-objects-are-creating-the-most-garbage – user2763361

1

Có một công cụ tuyệt vời từ những người FourSquare. Kiểm tra liên kết này và ví dụ nhanh mà họ có. Foursquare Heap tool.. Dựa trên chẩn đoán mà bạn tìm thấy trong bất kỳ công cụ nào được đề cập ở trên, giải pháp được sắp xếp nhiều nhất để giải quyết vấn đề sẽ là thêm RAM hoặc thêm nguồn vào bộ xử lý CPU của bạn. Nếu bạn mở một số thay đổi cơ sở hạ tầng, hãy kiểm tra Zing from Azul Systems. Nhưng tôi nghĩ rằng tùy chọn thứ hai có thể là một đoạn.