2011-10-07 10 views
30

Tôi đang chạy ứng dụng web java bằng Hibernate và glassfish Server. Tôi nhận đượcLỗi không gian PermGen - Máy chủ Glassfish

java.lang.OutOfMemoryError: PermGen space ngoại lệ khi sau khi triển khai vài lần.

Tôi đã thử sử dụng -XX:MaxPermSize=128M trong biến môi trường của mình, nhưng nó không hoạt động.

+0

Đây có phải là những gì bạn đang tìm kiếm: http://stackoverflow.com/questions/1996088/java-class-permgen-memory-leak-web-applications-generic-solution – Raedwald

Trả lời

37

là rò rỉ bộ nhớ lớp loader này. Mỗi lần bạn triển khai lại ứng dụng, trình nạp lớp mới được tạo cho nó và tất cả các lớp của ứng dụng của bạn được nạp lại. Điều này tiêu thụ bộ nhớ trong không gian gen perm.

Trình nạp lớp cũ và tất cả các lớp được tải của nó phải được thu thập rác, nếu không bạn cuối cùng sẽ chạy vào một không gian PermGen OOME sau khi triển khai nhiều lần. Điều này không hoạt động nếu một đối tượng được nạp bởi một trình nạp lớp bên ngoài giữ một tham chiếu đến bất kỳ đối tượng nào được nạp bởi trình nạp lớp cũ. This article giải thích rõ vấn đề.

Nói chung, rò rỉ bộ nạp lớp khó phân tích và đôi khi khó khắc phục. Để tìm hiểu lý do tại sao các trình nạp lớp cũ không phải là rác được thu thập, bạn phải sử dụng một trình thu thập thông tin. Trong JProfiler, sử dụng bộ đệm đường dẫn, chọn đối tượng trình nạp lớp thủy tinh và sử dụng chế độ xem tham chiếu đến để kiểm tra đường dẫn đến rễ thu gom rác.

Lớp trình tải lớp được gọi là org.apache.servlet.jasper.JasperLoader. Dưới đây là một ảnh chụp màn hình của một tình huống thường xuyên, nơi trình nạp lớp chỉ được tổ chức bởi các cá thể trực tiếp của các đối tượng được nạp.

enter image description here

Trong trường hợp của bạn, bạn sẽ thấy tài liệu tham khảo từ các đối tượng bên ngoài. Một nguyên nhân phổ biến khác của sự rò rỉ bộ nạp lớp trong các thùng chứa web là một luồng nền không bị dừng lại. Google Guice chẳng hạn có lỗi như vậy trong 3.0.

(Disclaimer: công ty tôi phát triển JProfiler)

5

Sự cố này xảy ra với việc triển khai lặp lại nhiều lần. Tôi đã phải đối mặt với điều này nhiều lần. Vui lòng tham khảo dưới đây liên kết JIRA cho lỗi glassfish:

http://java.net/jira/browse/GLASSFISH-587

+1

Bạn đã thấy năm báo cáo lỗi đó chưa ?! –

46

Để giải quyết vấn đề này (trong linux dựa os) làm sau

1) bộ nhớ tăng (vì vậy mà vấn đề này không đến thường xuyên) bằng cách định cấu hình "miền.xml" trong

/glassfish/domain/tên miền 1/config

tìm kiếm

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2) giết chết quá trình glassfish để giải phóng các cổng mà nó đang chạy (trong trường hợp của tôi là 8686) thiết bị đầu cuối mở (trong linux dựa trên os) và loại -

sudo netstat -npl | grep 8686

này sẽ dẫn đến một cái gì đó giống như ..

tcp6 0 0 :::8686 :::* LISTEN 3452/java

sử dụng tiếp theo

kill -9 3452 giết rằng quá trình (3452 trong trường hợp này)

Bây giờ cố gắng để bắt đầu glassfish, nó sẽ bắt đầu.

+0

cảm ơn bạn! rất tốt! –

9

Nếu bạn đang sử dụng Windows, hãy thử hủy quá trình thủy tinh (java.exe * 32) bằng Trình quản lý tác vụ và sau đó khởi động lại máy chủ.

+0

Điều này thật hoàn hảo –