Hôm qua tôi đã triển khai ứng dụng Grails (2.3.6) đầu tiên của mình cho một máy chủ dev và bắt đầu theo dõi nó. Tôi chỉ có một màn hình tự động nói rằng CPU đã được gắn trên máy tính này, và vì vậy tôi đã SSH vào nó. Tôi chạy top
và phát hiện ra rằng đó là PID của ứng dụng Java của tôi đang ghim máy chủ. Tôi cũng nhận thấy trí nhớ là 40%. Sau một vài giây, CPU đã ngừng ghim, giảm xuống mức bình thường và bộ nhớ quay trở lại khoảng ~ 20%. GC chính cổ điển.Hiểu rò rỉ bộ nạp lớp Groovy/Grails
Trong khi thu thập, tôi đã tạo một vùng lưu trữ. Sau GC, sau đó tôi mở bãi chứa trong JVisualVM và thấy rằng hầu hết bộ nhớ đã được cấp phát cho một lớp org.codehaus.groovy.runtime.metaclass.MetaMethodIndex.Entry
. Có gần 250.000 trường hợp trong số này, ăn khoảng 25 MB bộ nhớ.
Tôi googled lớp này và đã xem nó là ultra helpful Javadocs. Vì vậy, tôi vẫn không biết lớp này làm gì.
Nhưng googling nó cũng đưa ra khoảng một tá bài báo liên quan (một số câu hỏi SO) liên quan đến lớp này và rò rỉ lớp PermGen/classloader với các ứng dụng Grails/Groovy. Và mặc dù có vẻ như ứng dụng của tôi đã thực sự làm sạch các phiên bản 250K này với GC, nó vẫn gây rắc rối khi có quá nhiều phiên bản của nó và GC đã ghim CPU trong hơn 5 phút.
Câu hỏi của tôi:
- lớp này là gì và những gì là Groovy làm với nó?
- Ai đó có thể giải thích this answer cho tôi? Tại sao
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
giúp vấn đề cụ thể này? - Tại sao lớp học này đặc biệt phiền hà cho PermGen?