2012-05-21 32 views
5

Sự hiểu biết của tôi là PermGen (theo một nghĩa nào đó) giữ mã lớp trong bộ nhớ. Thường thì chúng tôi có rất nhiều tệp jar tham chiếu classpath của chúng tôi. Khi một tệp jar được bao gồm trong classpath (nói trong thư mục lib của tomcat), tất cả các lớp của tất cả các lọ đó được tự động nạp vào PermGen?khi nào các lớp trong lọ nhập PermGen

Trong một câu hỏi tương tự, khi một lớp của tệp jar được sử dụng, PermGen tải tất cả các lớp trong tệp jar đó hoặc chỉ lớp được sử dụng (và sau đó tải phần còn lại của tệp lớp khi cần thiết)?

Trả lời

4

Điều này phụ thuộc ở mức độ nào về việc thực hiện các classloader và JVM - các Java Virtual Machine specification nói điều này:

đặc điểm kỹ thuật này cho phép một sự linh hoạt thực hiện như khi hoạt động liên kết (và, vì đệ quy, bốc) diễn ra, với điều kiện là ngữ nghĩa của ngôn ngữ lập trình Java là tôn trọng, [...]

Ví dụ, một thi thể chọn để giải quyết mỗi tham khảo mang tính biểu tượng trong một lớp học hoặc giao diện individ ual, chỉ khi nó được sử dụng (độ phân giải lười hoặc trễ) hoặc để giải quyết tất cả cùng một lúc trong khi lớp đang được xác minh (độ phân giải tĩnh). Điều này có nghĩa là quá trình giải quyết có thể tiếp tục, trong một số triển khai, sau khi lớp học hoặc giao diện được khởi tạo.

Trong thực tế, việc triển khai sane sẽ tự động tải mọi thứ trong tệp JAR chỉ vì một lớp trong tệp được tải, hãy để một mình chỉ vì nó nằm trên đường dẫn lớp.

0

Chỉ các lớp cần thiết mới được tải và lưu trữ trong không gian permgen.

0

JLS đảm bảo rằng lớp học được khởi tạo khi - và không sớm hơn - lần đầu tiên được yêu cầu. Việc thực hiện được phép thực hiện tải và liên kết trước đó, mặc dù.

+0

Thực tế thông số kỹ thuật cho phép tải trước các lớp học một cách rõ ràng. Đó là một lớp học phải được nạp trước khi nó được sử dụng là khá rõ ràng. –

+0

Và điều gì về việc khởi tạo chúng? –

+0

Đó là một vấn đề khác. Tôi không nghĩ rằng việc khởi tạo có liên quan đến việc sử dụng PermGen, mặc dù tôi cho rằng việc triển khai có thể trì hoãn việc tải các lớp liên quan cho đến khi khởi tạo. –

2

PermGen là một chi tiết triển khai của HotSpot và Oracle cho biết họ muốn loại bỏ nó trong tương lai [1]. Nó không phải là một phần của đặc tả Java (VM). Chỉ các lớp được nạp mới kết thúc trong PermGen. Hoặc là một cách rõ ràng máng ClassLoader#loadClass hoặc ngầm qua liên kết. Điều đó chỉ nên là các lớp được sử dụng (và phụ thuộc của chúng) trừ khi ai đó đang tải tất cả các lớp một cách rõ ràng, ví dụ như. để thực hiện sự phản chiếu trên chúng. Các khung như Spring tránh điều này và thay vào đó quét mã byte.

Điểm đánh dấu tốt là VisualVM cho phép bạn quan sát các lớp được tải một PermGen.

[1] JRockit không có PermGen và trong các phiên bản HotSpot gần đây, chuỗi nội bộ chuỗi không còn trong PermGen nữa.

+1

Cần lưu ý rằng chỉ có các đối tượng java.lang.Class, một số đối tượng java.lang.String được liên kết với tên và tên phương thức của lớp và các đối tượng tĩnh được Lớp sẽ được tải vào PermGen. Nó không giống như bytecode của bạn được tải trong đó hoặc bất cứ điều gì ... –

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