PermGen thực sự là viết tắt của gì?


122

Tôi biết PermGen là gì, nó được sử dụng để làm gì, tại sao nó không thành công, cách tăng nó lên, v.v.

Những gì tôi không biết là PermGen thực sự là viết tắt của cái gì. Vĩnh viễn ... Gen ... gì đó?

Có ai biết PermGen thực sự là viết tắt của gì không?


1
[Mô tả tốt] [1] từ anh chàng biết nhiều về nội bộ GC. Nhân tiện, có rất nhiều thông tin hữu ích liên quan đến GC trong blog của anh ấy. [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan Dubrov,

Câu trả lời:


84

Thế hệ vĩnh viễn. Tất nhiên là chi tiết thực hiện cụ thể.

Tóm lại, nó chứa các đối tượng Java được liên kết với các lớp và các chuỗi đan xen. Trong triển khai máy khách của Sun với chia sẻ trên, classes.jsabộ nhớ được ánh xạ để tạo thành dữ liệu ban đầu, với khoảng một nửa chỉ đọc và một nửa sao chép khi ghi.

Các đối tượng Java đơn thuần là cũ được giữ lại trong Thế hệ có hạn.


19
"Trong JDK 7, chuỗi thực tập nội trú không còn được phân bổ trong thế hệ thường trực của đống Java": oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi

30
Và trong JDK 8 không có thế hệ vĩnh viễn nào cả! Thật vui khi thấy câu trả lời này phát triển qua nhiều năm.
Brian Gordon

3
@BrianGordon đúng .. Để biết thêm thông tin về điều đó: stackoverflow.com/a/22509753/4557537
Fadi

59

PermGen được sử dụng bởi JVM để giữ các lớp được tải. Bạn có thể tăng nó bằng cách sử dụng:

-XX:MaxPermSize=384m

nếu bạn đang sử dụng Sun JVM hoặc OpenJDK.

Vì vậy, nếu bạn nhận được OutOfMemoryException: PermGen, bạn cần phải làm cho PermGen lớn hơn hoặc bạn có thể gặp sự cố trình tải lớp.


6
Câu trả lời nào được chấp nhận tại thời điểm bạn đăng nhận xét này? Câu trả lời hiện được chấp nhận (câu trả lời này , của "Tom Hawtin - tackline") có vẻ chính xác với tôi. Có thể hợp lý khi chỉnh sửa nhận xét của bạn để không khiến mọi người tin tưởng vào câu trả lời được chấp nhận hiện tại?
jbyler


8

Không thực sự phù hợp với câu hỏi ban đầu, nhưng có thể ai đó sẽ thấy nó hữu ích. PermGen thực sự là một vùng trong bộ nhớ mà Java dùng để giữ các lớp của nó. Vì vậy, nhiều người trong chúng ta đã xem qua OOM trong PermGen, nếu có, chẳng hạn như rất nhiều lớp.

Kể từ Java 8, vùng PermGen đã được thay thế bằng vùng MetaSpace, hiệu quả hơn và không giới hạn theo mặc định (hoặc chính xác hơn - bị giới hạn bởi dung lượng bộ nhớ gốc, tùy thuộc vào tính khả dụng của bộ nhớ ảo 32 hoặc 64 bit jvm và hệ điều hành). Tuy nhiên, có thể điều chỉnh nó theo một số cách, ví dụ như chỉ định giới hạn tối đa cho khu vực. Bạn có thể tìm thêm thông tin hữu ích trong bài đăng trên blog này .




3

Nếu tôi nhớ không nhầm, gen là viết tắt của thế hệ, giống như trong một bộ thu gom rác thế hệ (xử lý các đối tượng trẻ hơn so với các đối tượng giữa đời và "vĩnh viễn"). Nguyên tắc địa phương đề xuất rằng các đối tượng được tạo gần đây sẽ bị xóa sổ trước.


1

Permgen là viết tắt của Permanent Generation. Nó là một trong những vùng nhớ JVM. Nó là một phần của Heap với kích thước cố định bằng cách sử dụng một cờ gọi là MaxPermSize.

Tại sao lại có tên "PermGen"?

Permgen này được đặt tên trong những ngày đầu của Java. Nguồn Permgen lưu giữ tất cả dữ liệu meta của các lớp được tải. Nhưng vấn đề là khi một lớp được tải, nó sẽ vẫn ở trong JVM cho đến khi JVM tắt. Vì vậy, tên permgen là lựa chọn cho điều đó. Nhưng sau đó, tải động của các lớp đã xuất hiện nhưng tên không được thay đổi. Nhưng với Java 8 , họ cũng đã giải quyết được vấn đề đó. Bây giờ permagen được đổi tên thành MetaSpace với kích thước bộ nhớ động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.