2010-03-31 31 views
5

Tôi đang sử dụng trình tải lớp tùy chỉnh mở rộng URLClassLoader. Tôi tải một số lớp vào trình nạp lớp tùy chỉnh của tôi và thực hiện một số tác vụ. Khi nhiệm vụ được hoàn thành, tôi muốn vứt bỏ bộ nạp lớp. Tôi đã thử làm điều đó bằng cách đặt tham chiếu thành null.xử lý bộ nạp lớp

Nhưng điều này không thu thập rác thải bộ nạp lớp.

Có cách nào có thể giúp những gì tôi muốn đạt được không?

+0

Xem http://stackoverflow.com/questions/148681/unloading-classes-in-java/148707#148707 –

+0

Không _quite_ cùng một câu hỏi, câu hỏi này là về dỡ bộ nạp lớp thay vì các lớp đã tải. –

+1

Lời khuyên đầu tiên của tôi là kiểm tra những gì làm cho các lớp học của bạn bên trong trình nạp lớp của bạn không thể đăng ký được. Tạo một bãi chứa và phân tích các phụ thuộc vào các lớp được giữ bởi trình nạp lớp của bạn. –

Trả lời

2

Từ ClassLoader doc: Every Class object contains a reference to the ClassLoader that defined it. Điều này ngăn cản trình tải của bạn được thu thập. Bạn sẽ phải vô hiệu hóa tất cả các tham chiếu đến các lớp và các thể hiện của các lớp đó.

3

Về cơ bản, như @invariant đã chỉ ra, dereferencing tất cả các lớp được tải bởi trình nạp lớp cụ thể sẽ làm cho bộ nạp lớp đó thu thập được. Tuy nhiên, có (ít nhất) một ngoại lệ: nếu một lớp được tuần tự hóa, thì lớp đó (và do đó trình nạp lớp của nó) được giữ lại trong nội bộ bởi ObjectStreamClass, đó là một lớp nguyên thủy và do đó không bao giờ được thu gom rác. Vì vậy, trong trường hợp này, trình nạp lớp không thể được thu thập rác cho đến khi toàn bộ JVM chấm dứt.

Xem phần giải thích đầy đủ here, trong phần "Các sự cố liên quan đến thu thập và sắp xếp rác".

0

Miễn là bất kỳ lớp nào được tải bởi trình nạp lớp này được tham chiếu, trình nạp lớp sẽ không được thu thập rác. Vì vậy, trình nạp lớp sẽ bị loại bỏ nếu: tất cả các tham chiếu trực tiếp tới trình nạp lớp đều bị vô hiệu hóa, tất cả các tham chiếu đến các lớp được nạp bởi trình nạp lớp này và các cá thể của các lớp này. Sau đó, nó có thể được đổ vào lần chạy tiếp theo của bộ thu gom rác.

1

Trình nạp lớp sẽ bị thu thập rác sau khi không có thêm phiên bản lớp được tạo bởi ClassLoader. Có một lỗi cũ (4950148) liên quan đến việc không có cách nào để loại bỏ rõ ràng một Trình nạp lớp, điều này gây ra sự cố ví dụ với khóa tệp.

Điều này hiện đã là fixed in JDK 7, thêm phương thức URLClassLoader.close().

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