2009-03-23 27 views
27

Mỗi 15-30 phút Netbeans hiển thị "java.lang.OutOfMemoryError: PermGen space". Từ những gì tôi đã học được từ Google, điều này dường như liên quan đến rò rỉ bộ nạp lớp hoặc rò rỉ bộ nhớ nói chung.Làm cách nào để ngăn chặn lỗi không gian PermGen trong Netbeans?

Thật không may tất cả các đề xuất tôi tìm thấy có liên quan đến máy chủ ứng dụng và tôi không có ý tưởng để thích nghi chúng với Netbeans. (Tôi thậm chí không chắc đó là vấn đề tương tự)

Đây có phải là vấn đề trong đơn đăng ký của tôi không? Làm thế nào tôi có thể tìm thấy nguồn?

+0

cũng xem http://stackoverflow.com/questions/717550/java-lang-outofmemoryerror-java-heap-space-with-netbeans – Steen

+0

Tại sao bạn không nâng cấp lên phiên bản NetBeans mới hơn? 6.5 thực sự là cũ. –

+4

@a_horse_with_no_name: Như câu hỏi này. Tôi hỏi nó hơn ba năm trước. –

Trả lời

32

Đó là do tải lớp không đổi.

Mã cửa hàng lớp Java và tất cả các hằng số (ví dụ: hằng số chuỗi) trong heap vĩnh viễn không phải là rác được thu thập theo mặc định (có ý nghĩa trong đa số trường hợp vì các lớp chỉ được tải một lần trong suốt thời gian tồn tại của một ứng dụng).

Trong các ứng dụng mà thường tải các lớp trong toàn bộ cuộc đời đó là:

  • web và máy chủ ứng dụng trong bố trí lại nóng;
  • IDE khi chạy các ứng dụng đã phát triển (mỗi khi bạn nhấn nút Run trong Netbeans hoặc nhật thực nó sẽ tải các lớp ứng dụng của bạn lên một lớp mới);
  • vv hành vi này không đúng vì một đống đầy đầy đủ.

Bạn cần phải bật bộ sưu tập thùng rác vĩnh viễn để ngăn chặn lỗi này.

tôi sử dụng tùy chọn

-XX:MaxPermSize=256M 
-XX:+CMSClassUnloadingEnabled 
-XX:+CMSPermGenSweepingEnabled 

(ngừng nhật thực của tôi 3,4 từ ném "java.lang.OutOfMemoryError: PermGen space" vì vậy nó cũng sẽ làm việc với netbeans).

Sửa: Chỉ cần lưu ý rằng đối Netbeans bạn thiết lập những tùy chọn trong: [Netbeans installation]\etc\netbeans.conf Bạn nên prefixe những tùy chọn với -J và thêm chúng vào netbeans_default_options (xem chú thích trong netbeans.conf để biết thêm thông tin).

+0

OK, không có câu trả lời nào thực sự hữu ích, nhưng điều này đã giúp tôi tiết kiệm thời gian nhất giữa các lần khởi động lại :) –

+0

cố gắng tăng tối đa từ 50 triệu đồng trở lên cho đến khi thu thập dữ liệu. có thể chứa (số lượng đối tượng permamanet còn sống vượt quá dung lượng heap nén) –

+1

Các đối số dường như hoạt động đối với tôi (phân tích mã byte của rt.jar trong trường hợp của tôi), tuy nhiên, tôi đã nhận được cảnh báo 'Vui lòng sử dụng CMSClassUnloadingEnabled thay cho CMSPermGenSweepingEnabled trong tương lai'. Vẫn làm việc. – Grundlefleck

2

Xem điều này link về cách đặt kích thước PermSize. Có lẽ đây không phải là vấn đề mã của bạn, vì vậy giải pháp duy nhất là tăng PermSize. Tôi đã thấy rằng điều này là khá thường xuyên, khi bạn làm việc với JAXB. Nói chung, nếu bạn sử dụng nhiều thư viện mà bản thân cũng phụ thuộc vào nhiều tệp jar khác, kích thước mặc định của khoảng trống PermGen có thể không đủ lớn.

Xem các bài đăng trên blog để biết thêm chi tiết: Classloader leaksHow to fix the dreaded "java.lang.OutOfMemoryError: PermGen space"

1

Bạn có thể thay đổi các tùy chọn khởi động của netbeans JVM bằng cách chỉnh sửa tập tin /etc/netbeans.conf. Tôi thường có loại lỗi này khi tôi phát triển một Webapp và tôi triển khai nó thường xuyên. Trong trường hợp đó, tôi khởi động lại tomcat theo thời gian.

4

Hãy thử thêm đối số sau vào netbeans netconf: -J-XX: MaxPermSize = 256m

2

Nếu bạn đang phát triển một ứng dụng web, hãy cố gắng đặt trên máy chủ tùy chọn vm

-Xmx512m -Xms512m -XX: MaxPermSize = 512M

Vào Tools/Servers // Hệ máy/VM Options (Netbeans 7.4)

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