2012-06-07 39 views
7

Tôi gặp sự cố lạ này với máy chủ tomcat 5.5 và tomcat 6.0. Tôi có hai ứng dụng web sẽ được cài đặt trên tomcat.Khi tomcat được khởi động, hai ứng dụng web này cũng được bắt đầu đồng thời nhưng đôi khi một ứng dụng web không khởi tạo được do lỗi init trong một ứng dụng ứng dụng khác đang gặp lỗi classnotfoundexception khi chạy. Trong tomcat 7.0, ứng dụng đang chạy tốt ngay cả khi ứng dụng khác không khởi tạo được.Lỗi phát hiện lỗi ClassNotFoundException trong Tomcat 5.5 và Tomcat 6.0

Sau khi gỡ lỗi, tôi đã biết có một bình chứa tên là crystal.jar nằm trong thư mục web-inf/lib của cả hai ứng dụng. Tôi đã chuyển jar vào thư mục chung/lib của tomcat sau đó nó bắt đầu hoạt động tốt. Tôi muốn biết lý do tại sao nó làm việc tốt trong tomcat 7,0 không trong phiên bản tomcat 5.x và tomcat 6.x. Có sự thay đổi nào trong kiến ​​trúc tải lớp giữa các phiên bản này không?

Cảm ơn

EDIT1: Thư viện là ở vị trí của cả hai ứng dụng thư mục WEB-INF \ lib và họ không có sự phụ thuộc với các file DLL mở rộng. Bây giờ tôi đã đọc về kiến ​​trúc lớp học tomcat 5.5 và biết rằng mọi ứng dụng web đều có trình nạp lớp riêng của nó. Các thư viện trong thư mục và thư mục lớp WEB-INF \ lib sẽ được nạp vào bộ nạp lớp này. Các thư viện được lưu trữ trong thư mục chung sẽ được đặt vào một trình nạp lớp được chia sẻ. Sau đó, thư viện này sẽ được tải một cách riêng biệt trong trình nạp lớp riêng biệt của ứng dụng web. Có ngay cả khi một ứng dụng web không khởi động được ứng dụng web khác sẽ hoạt động độc lập. Đó là lý do tại sao tôi cảm thấy lạ và cần phải điều tra furthur.

Trả lời

6

Cuối cùng tìm thấy câu trả lời cho vấn đề này

Có tồn tại một loại tiếng của rò rỉ bộ nhớ PermGen, khi một lớp thư viện được tham chiếu bởi một lớp hệ thống và do đó sống ngoài độ tuổi của nó. Một ví dụ là khi Java phát hiện ra trình điều khiển JDBC hoặc một số dịch vụ khác và "tự động đăng ký" nó. Nó giữ tham chiếu đến nó trong một hệ thống , nhưng bản thân lớp đó thuộc về ứng dụng web và phải tải xuống khi ứng dụng ngừng - nhưng không thể, vì tham chiếu đó . Không phải tất cả các tài liệu tham khảo như vậy đều dễ hiểu.

Một triệu chứng điển hình trong trường hợp này là các ứng dụng web đầu tiên dựa trên tính năng hệ thống này sẽ thành công, nhưng thứ hai và người khác sẽ thất bại (vì dịch vụ được đăng ký trong hệ thống thuộc đầu tiên ứng dụng web và không thể xem các lớp học từ trình nạp lớp của ứng dụng thứ hai và ngược lại).

Tomcat 7 và các phiên bản gần đây của Tomcat 6 có bảo vệ tốt hơn chống lại một số rò rỉ bộ nhớ PermGen đã biết trong cấu hình mặc định .

Tomcat 5.5 không có sự bảo vệ như vậy.

EDIT Một số tài liệu tham khảo

http://people.apache.org/~markt/presentations/2010-08-05-Memory-Leaks-JavaOne-60mins.pdf http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf

http://eclipse.org/mat/

http://wiki.apache.org/tomcat/FAQ/Troubleshooting_and_Diagnostics http://wiki.apache.org/tomcat/MemoryLeakProtection

+0

Vì vậy, bạn vừa tăng MaxPermSize, phải không? –

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