2013-08-29 32 views
5

Tôi biết rằng hệ thống cấp bậc của bộ tải lớp trong java là:Tại sao cần nhiều trình nạp lớp hơn?

lớp 1.Bootstrap nạp (trong mã nguồn gốc)
2. Việc gia lớp loader (sun.misc.Launcher$ExtClassLoader)
3. lớp Hệ thống nạp (sun.misc.Launcher$AppClassLoader class)
4 Trình tải lớp tùy chỉnh (ví dụ: máy chủ ứng dụng, trình nạp lớp tai, bộ nạp lớp chiến tranh)

Không rõ lý do tại sao các trình nạp lớp con bổ sung là cần thiết. Tôi có thể hiểu được nhu cầu của bộ nạp lớp 'pure java' sau khi một trong mã nguồn gốc.
Tôi có một số suy nghĩ về lý do có thể nhưng ai đó có thể cung cấp cho tôi giải thích rõ ràng về hành vi này/cần cho các hệ thống phân cấp của trình nạp lớp?
Nói chung nhưng cũng áp dụng cho j2ee.

Trả lời

4

Trình nạp lớp hữu ích cho việc cung cấp nhiều hành vi khác nhau và để bảo vệ các chương trình Java khác nhau chạy trong cùng một máy ảo với nhau. Có ba danh mục chính xuất hiện trong đầu:

  • Trình nạp lớp có thể triển khai quá trình tải các lớp khác nhau. Ví dụ, bạn có thể có một trình nạp lớp truy xuất bytecode cho một lớp từ một số máy chủ và sau đó cài đặt nó vào JVM, hoặc bạn có thể có một trình nạp lớp thực sự là generates the bytecode on the fly thay vì đọc nó ra khỏi một tệp.
  • Trình nạp lớp có thể tạo thành các phân vùng bên trong một JVM duy nhất để mã "cây" khác nhau có thể có các bản sao khác nhau của các lớp có cùng tên. Một ví dụ phổ biến của việc này là một thùng chứa servlet như Tomcat, trong đó một số war có thể được cài đặt mà tất cả đều có các phiên bản khác nhau của một thư viện (ví dụ, Apache Commons-Lang). OSGi cũng sử dụng phương pháp này để đảm bảo rằng mỗi gói chỉ có thể truy cập vào các lớp được yêu cầu cụ thể và không thể "rò rỉ" API.
  • Trình nạp lớp có thể được sử dụng để thực hiện các chính sách khác nhau về thời điểm tự thu thập rác các lớp thực tế. Chỉ sử dụng trình nạp lớp mặc định sẽ giữ các lớp xung quanh vô thời hạn, dẫn đến các lỗi PermGen đáng sợ; một ứng dụng sử dụng rất nhiều các lớp tạm thời (có thể những lớp được tạo ra trên bay) có thể muốn đảm bảo rằng chúng được giải phóng khi không cần thiết nữa bằng cách sử dụng các trình nạp lớp dùng một lần.
+0

Trình tải lớp được yêu cầu để giữ tất cả các lớp mà chúng đã tải có thể truy cập, miễn là bản thân 'ClassLoader' có thể truy cập được.Nếu bạn muốn một lớp được thu thập trước đó, hãy tạo một cá thể 'ClassLoader' mới đặc biệt cho nó. –

+0

Bạn nói đúng; chỉnh sửa. – chrylis

0

Tôi đoán trình nạp lớp đang sử dụng phụ thuộc vào máy chủ ứng dụng cụ thể. Đây là tài liệu cho Tomcat class loaders.

Trong Tomcat, về cơ bản chúng đã tạo các trình nạp lớp khác nhau để tải các lớp từ các vị trí khác nhau. Ví dụ: trình nạp lớp phổ biến tải lib được chia sẻ từ $CATALINA_HOME/lib. Mỗi trình tải lớp ứng dụng web sẽ tải các lớp học từ thư mục WEB-INF tương ứng.

Vì vậy, nhu cầu về trình tải lớp phát sinh chủ yếu từ nhu cầu tải từ các vị trí khác nhau, với một số quy tắc ưu tiên (ví dụ: lớp học từ WEB-INF được ưu tiên hơn CATALINA_HOME/lib). Ngoài ra, chúng cho phép các phiên bản khác nhau của một lớp được nạp vào các trình nạp lớp khác nhau. Ví dụ: hai ứng dụng web có thể sử dụng hai phiên bản khác nhau của Log4j theo cách này.

Máy chủ ứng dụng khác có thể có cấu trúc phân cấp trình nạp lớp khác nhau, nhưng cùng một lý do cũng áp dụng cho chúng.

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