2009-04-03 37 views
16

Tôi đã có một ứng dụng Grails thực hiện một số lượng khá phong phú về việc tạo và phá hủy đối tượng miền, và dường như nó chạy ra khỏi không gian PermGen với tốc độ rất nhanh. Tôi đã thực hiện các chỉnh sửa thông thường (va chạm PermGen đến 256M, cho phép lớp GC, v.v.), nhưng không có súc sắc.Khắc phục sự cố rò rỉ bộ nhớ Grails/Groovy?

Có ai muốn giới thiệu một số công cụ (và hy vọng miễn phí hoặc chi phí rất thấp) để khắc phục sự cố tiêu thụ bộ nhớ này trong Groovy và/hoặc Java không? Hoặc một số kỹ thuật mà bạn sử dụng để khắc phục sự cố bộ nhớ JVM?

Chỉnh sửa: Đây là khi ứng dụng được triển khai bên trong Tomcat ở chế độ sản xuất; Tôi đã không thử với các container khác. Mặc dù vậy, nó sẽ là tốt đẹp để có một số nguồn lực để theo dõi xuống vấn đề.

+2

làm thế nào bạn kết thúc giải quyết vấn đề của bạn?Chúng tôi sử dụng tìm kiếm và thạch anh (trong số các plugin khác) và xem mức sử dụng không gian PERMGEN của chúng tôi tăng lên với khá nhiều yêu cầu. – hvgotcodes

Trả lời

1

YourKit là một công cụ tốt đẹp mà tôi đã sử dụng nhiều lần để chẩn đoán các vấn đề về bộ nhớ. Nó là thương mại, nhưng nó có một phiên bản đánh giá miễn phí có sẵn để gỡ lỗi một lần.

1

Sự cố bạn đang gặp phải trong quá trình phát triển hay sản xuất?

Nếu bạn đang phát triển, hãy nhớ rằng Grails liên tục biên dịch lại nhiều khía cạnh của ứng dụng của bạn (không chỉ thay đổi tên miền, mà còn thay đổi bộ điều khiển và các lớp khác). Tôi cũng gặp vấn đề với PermGen, nhưng hầu hết đều được kích hoạt bằng việc biên dịch lại ổn định các tập tin mà tôi đang làm việc. Bạn có thể tắt tính năng này

http://www.grails.org/FAQ#Q:%20OMG%20I%20get%20OutOfMemoryErrors%20or%20PermGen%20Space%20errors%20when%20running%20Grails%20in%20development%20mode.%20What%20do%20I%20do?

Nếu bạn đang trong quá trình sản xuất, thì rõ ràng bạn có vấn đề quan trọng hơn nhiều. Các vấn đề về bộ nhớ PermGen là do nhiều khung công tác mà Grails được xây dựng, bao gồm Spring, Hibernate và thậm chí là JVM của Sun. Bạn có thể thử tinh chỉnh kích thước heap tối đa cho vùng chứa Web của bạn (Tomcat hoặc Jetty).

Bạn cũng có thể thử triển khai khác nhau của JVM, như JRockit của Oracle, được cho là tốt hơn đáng kể trong thu gom rác thải và các phương tiện hiệu quả khác. Tôi chưa bao giờ thử bản thân mình, nhưng vì tôi cũng đang ở giữa dự án Grails đang phát triển và mở rộng, tôi có thể là những giải pháp mua sắm cho chính những vấn đề này. Chúc may mắn!

+0

JRockit là sản phẩm của Oracle http://www.oracle.com/technology/software/products/jrockit/index.html –

+0

Tôi đang chạy ở chế độ sản xuất trên Tomcat (6.0.18) và không thực sự có một sự lựa chọn về JVM. –

+0

Tôi đã đọc rằng một trong những vấn đề với bộ sưu tập rác trong vùng chứa Web là ngăn xếp chỉ thực sự được làm mới khi vùng chứa được khởi động lại. (Khởi động lại container tương đương với việc khởi động lại dịch vụ Tomcat, không đơn giản là khởi động lại một ứng dụng Web.) –

6

Cá nhân tôi thích VisualVM. Chắc chắn có nhiều công cụ mạnh hơn, nhưng công cụ này có tỷ lệ khả năng sử dụng tốt.

0

Nếu điều này xảy ra sau khi bạn triển khai lại ứng dụng của mình nhiều lần, bạn có thể bị ảnh hưởng bởi this Grails bug. Tomcat FAQ cũng có một số nguyên nhân có thể gây ra rò rỉ PermGen.

+0

Tôi thực sự nghĩ đó là vấn đề gốc (ứng dụng chạy tốt trong Jetty), nhưng thậm chí tôi cũng muốn có một tài nguyên tốt tiếp tục thực hiện loại gỡ lỗi này. –

10

Các bạn đã thử

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

?

Cùng với sự gia tăng các nghi phạm thông thường (-Xmx, -Xms, -XX:PermSize-XX:MaxPermSize) này giải quyết tất cả các vấn đề về sản xuất của chúng tôi PermGen Tomcat, vốn đã xảy ra rất nhanh chóng, sau khi triển khai ứng dụng. Không bao giờ nhìn thấy một ngoại lệ OOM sau đó. :-)

+1

bất kỳ vấn đề nào liên quan đến hiệu suất với giải pháp này? Chúng tôi đang sử dụng các plugin có thể tìm kiếm, có thể kiểm tra, và thạch anh với rất nhiều công việc thường xuyên và nhận được một OOG PermGen mỗi tuần ... – hvgotcodes

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