Sự khác biệt giữa PermGen và Metaspace là gì?


118

Cho đến Java 7, có một vùng trong bộ nhớ JVM được gọi là PermGen , nơi JVM được sử dụng để giữ các lớp của nó. Trong Java 8, nó đã bị loại bỏ và được thay thế bằng vùng gọi là Metaspace .

Sự khác biệt quan trọng nhất giữa PermGen và Metaspace là gì?

Sự khác biệt duy nhất mà tôi biết là nó java.lang.OutOfMemoryError: PermGen spacekhông thể được ném nữa và tham số VM MaxPermSizebị bỏ qua.


kết quả đầu tiên trên google: infoq.com/articles/Java-PERMGEN-Removed
the8472,

@ the8472 Vâng, nhưng kết quả này (và nhiều kết quả khác) trên google chỉ mô tả cơ chế Metaspace, không đề cập bất cứ điều gì về sự khác biệt chính xác giữa cái này và PermGen.
Kao

Câu trả lời:


137

Sự khác biệt chính từ góc độ người dùng - mà tôi nghĩ câu trả lời trước đây không đủ nhấn mạnh - là Metaspace theo mặc định tự động tăng kích thước của nó (lên đến những gì hệ điều hành cơ bản cung cấp), trong khi PermGen luôn có kích thước tối đa cố định. Bạn có thể đặt mức tối đa cố định cho Metaspace với các tham số JVM, nhưng bạn không thể làm cho PermGen tự động tăng.

Ở một mức độ lớn, nó chỉ là một sự thay đổi tên. Trở lại khi PermGen được giới thiệu, không có Java EE hoặc lớp động (un) tải, vì vậy khi một lớp được tải, nó sẽ bị kẹt trong bộ nhớ cho đến khi JVM tắt - do đó là Thế hệ vĩnh viễn . Ngày nay các lớp có thể được tải và không tải trong thời gian tồn tại của JVM, do đó, Metaspace có ý nghĩa hơn đối với khu vực lưu giữ siêu dữ liệu.

Cả hai đều chứa các java.lang.Classcá thể và cả hai đều bị rò rỉ ClassLoader . Chỉ có sự khác biệt là với cài đặt mặc định của Metaspace, phải mất nhiều thời gian hơn cho đến khi bạn nhận thấy các triệu chứng (vì nó tự động tăng hết mức có thể), tức là bạn chỉ đẩy vấn đề đi xa hơn mà không giải quyết được nó. OTOH Tôi tưởng tượng ảnh hưởng của việc hết bộ nhớ hệ điều hành có thể nghiêm trọng hơn là chỉ dùng hết JVM PermGen, vì vậy tôi không chắc nó có cải thiện nhiều không.

Cho dù bạn đang sử dụng JVM với PermGen hay với Metaspace, nếu bạn đang thực hiện dỡ lớp động, bạn nên thực hiện các biện pháp chống rò rỉ bộ nạp lớp, ví dụ bằng cách sử dụng thư viện Ngăn chặn rò rỉ ClassLoader của tôi .


17
Cả Permgen và Metaspace đều không chứa các thể hiện của lớp Class. Họ chỉ giữ thông tin meta về các lớp được tải. Các thể hiện của lớp Lớp được lưu giữ trong đống thông thường, giống như các thể hiện của các lớp khác.
Joe trung bình

So sánh đẹp. Cảm ơn
Sandeep

1
Nhân tiện, OTOH có nghĩa là, "Mặt khác"
sofs1

43

Tạm biệt, Tạm biệt PermGen, Xin chào Metaspace

PermGen đã bị loại bỏ hoàn toàn.

Thu gom rác trong không gian - Thu gom rác của các lớp chết và bộ nạp lớp được kích hoạt khi mức sử dụng siêu dữ liệu của lớp đạt đến MaxMetaspaceSize.

Không gian Metadatađược tổ chức không còn tiếp giáp với Java heap, metadatahiện đã chuyển sang bộ nhớ gốc đến một khu vực được gọi là Metaspace.

Nói một cách đơn giản ,

Vì siêu dữ liệu lớp được cấp phát từ bộ nhớ riêng nên không gian khả dụng tối đa là tổng bộ nhớ hệ thống khả dụng. Do đó, bạn sẽ không còn gặp phải OOM errorsvà cuối cùng có thể tràn vào không gian hoán đổi.

Việc loại bỏ PermGenkhông có nghĩa là các vấn đề rò rỉ bộ nạp lớp của bạn đã biến mất. Vì vậy, có, bạn vẫn sẽ phải theo dõi mức tiêu thụ của mình và lập kế hoạch cho phù hợp, vì một sự cố rò rỉ sẽ tiêu tốn toàn bộ bộ nhớ gốc của bạn.

Một số bài viết khác, có phân tích: Link1 , Link2 , và cái này


6
Thay vì MaxPermGen, bạn có MaxMetaspaceSize, vì vậy không có lý do gì nó sẽ sử dụng nhiều hơn hoặc ít bộ nhớ hơn hoặc bạn có ít quyền kiểm soát hơn.
Peter Lawrey

2
ký ức chúng ta đang nói về ở đây là gì? Bộ nhớ RAM hoặc bộ nhớ HDD.
Dinesh

1
@Dinesh RAM (bộ nhớ trong)
Aditya Gupta

10

Nói tóm lại, kích thước Metaspace tự động tăng trong bộ nhớ gốc theo yêu cầu để tải siêu dữ liệu lớp nếu không bị hạn chế với -XX:MaxMetaspaceSize

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.