2011-10-14 26 views
6

Chúng tôi đang viết một ứng dụng GUI lớn ở Scala với nhiều lớp và chúng tôi phải tăng không gian PermGen để có thể tải tất cả các lớp. Bản thân ứng dụng sẽ hiển thị một loạt các hoạt động dựa trên màn hình, mỗi hoạt động sẽ tải các lớp học riêng của mình. Chỉ có một hoạt động được tải/hiển thị tại bất kỳ thời điểm nào. Sau khi thực hiện một số hoạt động, chúng tôi đã có một số OutOfMemoryError trong không gian PermGen.Tiết kiệm không gian PermGen với một số bộ nạp lớp

Tôi hiểu rằng không gian PermGen là garbage collected just like the rest of the heap, nhưng tôi quan tâm để xem liệu tôi có thể giảm không gian PermGen cần thiết bằng ví dụ hay không. một ClassLoader cho mỗi hoạt động để cho phép xếp lớp.

Vì vậy:

  1. Tôi hiểu rằng lớp được nạp bởi các ClassLoader hệ thống không thể được dỡ xuống, vì họ sẽ mãi mãi được tham chiếu bởi bộ nạp lớp của họ. Điều đó có đúng không?
  2. Không có trường hợp nào khác của lớp được trình nạp lớp tùy chỉnh của tôi tải xuống và trình tải lớp có thể được thu thập rác, các lớp của nó sẽ được tải, giải phóng không gian PermGen?
  3. Có bất kỳ cảnh báo nào liên quan đến (hoặc những lỗi phổ biến có thể ngăn chặn) xếp dỡ lớp học không?
+0

PermGen của bạn lớn bao nhiêu? –

+0

128m quá nhỏ, 256m hoạt động bây giờ, nhưng trong bao lâu?… –

Trả lời

6

... nếu tôi có thể giảm không gian PermGen cần thiết bằng ví dụ: một Trình nạp lớp cho mỗi hoạt động để cho phép xếp lớp.

Có, cách duy nhất Các lớp học đủ điều kiện để được tải xuống là nếu Trình nạp lớp được sử dụng là rác được thu thập. Điều này có nghĩa là các tham chiếu tới mọi lớp đơn và chính trình nạp lớp cần phải bằng không.

PermGen của bạn lớn bao nhiêu? Bạn có thể lấy đi chỉ bằng cách chạm PermGen với:

-XX:MaxPermGen=256m 

trên dòng lệnh của bạn. Nó không phải là không phổ biến để thiết lập nó đến 512m. Nếu bạn muốn một giải pháp thực sự mạnh mẽ, bạn sẽ cần phải đi theo con đường của việc sử dụng một bộ nạp lớp tùy chỉnh cho mỗi 'hoạt động'. Để trợ giúp gỡ lỗi, hãy thêm đối số tự giải thích sau đây vào dòng lệnh của bạn:

-XX:+TraceClassLoading 

Thao tác này sẽ in ra các lớp khi chúng được nạp trong JVM vào dòng lệnh.

+0

Cảm ơn câu trả lời. Có vẻ như '-XX: + TraceClassloading' không có sẵn trên phiên bản JRE 1.6.0_26 của tôi trên Mac OS X; bất kỳ sự thay thế nào? –

+0

-XX: + TraceClassLoading –

+0

OK, công trình này, cảm ơn. Tôi cũng sử dụng '-XX: + TraceClassUnloading' ngay bây giờ. –

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