2009-10-27 30 views
59

Tôi đang xem tài liệu ở số Java Memory Management và trong đó tôi bắt gặp PermSize mà tôi không thể hiểu được. Các tài liệu nói rằng nó lưu trữ, "JVM lưu trữ siêu dữ liệu của nó", nhưng tôi không thể chính xác có được những gì có nghĩa là bởi siêu dữ liệu. Tôi đã googling và một nơi nào đó tôi đọc nó lưu trữ một đối tượng giá trị (người dùng xác định đối tượng).'PermSize' trong Java là gì?

Loại đối tượng nào được lưu trữ ở đó? Một ví dụ với một lời giải thích sẽ là tuyệt vời.

+0

Giá trị mặc định là 64m đối với máy ảo 64 bit. Chúng tôi tăng nó lên '512m' cho một máy chủ tomcat chạy 8 ứng dụng đường ray.'-XX: MaxPermSize = 512m -XX: PermSize = 512m'. Tomcat với nhiều định nghĩa lớp chính nó cần một PerSize lớn và với ruby, ruby ​​trên đường ray kết hợp với jruby .. cần một PermSize rất lớn. –

+2

Lưu ý rằng các thế hệ Vĩnh viễn (và với các tham số PermSize) sẽ biến mất trong Java 8. Chúng được thay thế bằng "Metaspace". Xem http://javaeesupportpatterns.blogspot.co.uk/2013/02/java-8-from-permgen-to-metaspace.html – sleske

Trả lời

100

Một định nghĩa nhanh chóng của các "thế hệ vĩnh viễn":

"Thế hệ lâu dài được sử dụng để giữ dữ liệu phản chiếu của VM tự như các đối tượng lớp và phương pháp đối tượng Những đối tượng phản xạ là . được phân bổ trực tiếp vào thế hệ vĩnh viễn và có kích thước là độc lập với các thế hệ khác. " [ref]

Nói cách khác, đây là nơi định nghĩa lớp đi (và điều này giải thích lý do tại sao bạn có thể nhận được thông báo OutOfMemoryError: PermGen space nếu một ứng dụng tải một số lượng lớn các lớp học và/hoặc trên tái triển khai).

Lưu ý rằng PermSize là bổ sung cho các giá trị -Xmx thiết lập bởi người sử dụng vào các tùy chọn JVM. Nhưng MaxPermSize cho phép JVM có thể phát triển PermSize với số tiền được chỉ định. Ban đầu khi VM được tải, MaxPermSize sẽ vẫn là giá trị mặc định (32mb cho -client và 64mb cho -server) nhưng sẽ không thực sự chiếm số tiền đó cho đến khi cần. Mặt khác, nếu bạn đã thiết lập CẢ PermSizeMaxPermSize tới 256MB, bạn sẽ nhận thấy rằng các đống tổng thể đã tăng thêm 256MB bổ sung cho các thiết lập -Xmx.

9

Hồ bơi có chứa tất cả mọi thứ không phải là dữ liệu ứng dụng của bạn, mà là những thứ cần thiết cho VM: thông thường nó chứa chuỗi nội bộ, mã byte của các lớp đã xác định, nhưng cũng là các phần dữ liệu "không phải của bạn".

22

This blog post đưa ra giải thích tốt đẹp và một số nền tảng. Về cơ bản, "thế hệ vĩnh viễn" (có kích thước được PermSize) sử dụng để lưu trữ những thứ mà JVM phải phân bổ không gian, nhưng sẽ không được thu gom rác (thường là "vĩnh viễn") (+). Điều đó có nghĩa là cho các lớp được nạp ví dụ và các trường tĩnh.

Ngoài ra còn có FAQ on garbage collection trực tiếp từ Mặt trời, giải đáp một số câu hỏi về thế hệ vĩnh viễn. Cuối cùng, đây là một số blog post với nhiều chi tiết kỹ thuật.

(+) Trên thực tế, các phần của thế hệ vĩnh viễn sẽ được tạo thành GC, ví dụ: các đối tượng lớp sẽ bị loại bỏ khi một lớp được giải phóng. Nhưng điều đó là không phổ biến khi thế hệ vĩnh viễn được đưa vào JVM, do đó tên.