2012-04-20 32 views
5

1) Nếu tôi sử dụng Class.forName() sau đây được gọi là nhiều lần, nó sẽ gây rò rỉ bộ nhớ?Sẽ sử dụng class.forname nhiều lần gây ra rò rỉ bộ nhớ? (chạy bên trong tomcat)

Class.forName("MyClass") 

2) Hoặc là WebAppClassLoader tomcat đang xảy ra để kiểm tra xem "MyClass" đã được nạp và sử dụng các ví dụ cache để thay thế.

3) Nếu câu trả lời cho câu hỏi (2) là 'không', thì lớp được tải trước đó sẽ bị thu thập rác, nếu tôi bật PermGen quét và thiết lập các thông số jvm có liên quan.

Nếu tôi muốn tránh tải lại lớp học, cách tốt nhất để sử dụng bộ nhớ cache của lớp. Tôi có thể lưu trữ cá thể lớp dưới dạng HashMap

+0

Tôi không nghĩ rằng nó sẽ bị rò rỉ bộ nhớ miễn là nó được tải từ cùng một trình nạp lớp ở vị trí đầu tiên. Ngoài ra ClassLoader thay đổi theo thời gian cũng có vẻ khó xảy ra. –

Trả lời

9

1) Không, một định nghĩa lớp chỉ được tải một lần bởi bất kỳ trình nạp lớp nhất định nào. Sau đó, nó được lưu giữ trong bộ nhớ (trong không gian PermGen) và được tái sử dụng trên các tham chiếu tiếp theo tới lớp, cho đến khi trình nạp lớp tồn tại. Điều này độc lập với cách tham chiếu của lớp học: qua số Class.forName, ClassLoader.loadClass hoặc bất kỳ thứ gì.

Định nghĩa cùng một lớp có thể được nạp vào các trình nạp lớp khác nhau nhiều lần (kết quả là nhiều đối tượng mã thông báo lớp trong bộ nhớ). Các tính năng này được tính là các lớp hoàn toàn khác nhau, không thể được đúc với nhau, ngay cả khi chúng được tải chính xác từ cùng một tệp lớp.

2) Có

3) N/A

4) bài viết tham khảo đề cập rằng lớp được nạp lại trong một classloader khác nhau, vì vậy giải thích của tôi dưới 1) áp dụng.

+0

Tôi cho rằng điều này sẽ sử dụng cùng một trình nạp lớp sẽ là trình nạp lớp của ứng dụng web này được cung cấp bởi tomcat. –

+1

@samarjitsamanta, có lẽ là có, mặc dù tôi không phải là chuyên gia Tomcat vì vậy đừng coi lời của tôi là bảo đảm :-) –

+0

câu trả lời của câu hỏi thứ 4 là một phần ngu ngốc của tôi mà trộn lẫn trình nạp lớp và cá thể lớp:) Tôi nhận ra và loại bỏ câu hỏi không liên quan. cảm ơn cho trả lời nhanh chóng. –

0

từ tài liệu:

Trả về đối tượng Lớp được liên kết với lớp hoặc giao diện với tên chuỗi đã cho.

Tôi không thấy dấu hiệu nào cho thấy lớp nên được tải lại. Nó chỉ đơn giản là trả về nó cho thấy nó sẽ được an toàn để gọi nhiều lần.

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