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
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? –
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. –
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. –