Loại bỏ PermGen trong JDK 8


Câu trả lời:


358

Lý do bỏ qua các đối số này là thế hệ vĩnh viễn đã bị xóa trong HotSpot cho JDK8 vì những hạn chế sau

  • Kích thước cố định khi khởi động - khó điều chỉnh.
  • Các loại Hotspot nội bộ là các đối tượng Java: Có thể di chuyển với đầy đủ GC, mờ đục, không được gõ mạnh và khó gỡ lỗi, siêu dữ liệu cần thiết.
  • Đơn giản hóa các bộ sưu tập đầy đủ: Các trình vòng lặp đặc biệt cho siêu dữ liệu cho mỗi trình thu thập
  • Muốn phân bổ dữ liệu lớp đồng thời và không trong thời gian tạm dừng GC
  • Cho phép các cải tiến trong tương lai bị giới hạn bởi PermGen.

Không gian thế hệ vĩnh viễn (PermGen) đã bị xóa hoàn toàn và được thay thế bằng một không gian mới gọi là Metaspace. Hậu quả của việc loại bỏ PermGen là rõ ràng các đối số JVM của PermSize và MaxPermSize bị bỏ qua và bạn sẽ không bao giờ gặp phải lỗi java.lang.OutOfMemoryError: PermGen.

Ưu điểm của MetaSpace

  • Tận dụng thuộc tính Đặc tả ngôn ngữ Java: Các lớp và vòng đời siêu dữ liệu được liên kết khớp với trình nạp của lớp
  • Mỗi khu vực lưu trữ bộ tải - Metaspace
  • Chỉ phân bổ tuyến tính
  • Không khai hoang riêng lẻ (ngoại trừ RedefineClass và lỗi tải lớp)
  • Không quét hoặc nén GC
  • Không di dời cho các đối tượng metaspace

Điều chỉnh Metaspace

Kích thước metaspace tối đa có thể được đặt bằng cờ -XX: MaxMetaspaceSize và mặc định là không giới hạn, điều đó có nghĩa là chỉ bộ nhớ hệ thống của bạn là giới hạn. Cờ điều chỉnh -XX: MetaspaceSize xác định kích thước ban đầu của metaspace Nếu bạn không chỉ định cờ này, Metaspace sẽ tự động thay đổi kích thước tùy theo nhu cầu ứng dụng khi chạy.

Thay đổi cho phép tối ưu hóa và các tính năng khác trong tương lai

  • Chia sẻ dữ liệu lớp ứng dụng
  • Tối ưu hóa bộ sưu tập trẻ, dỡ lớp G1
  • Giảm kích thước siêu dữ liệu và các dự án dấu chân JVM nội bộ

Có cải thiện hiệu suất GC cũng. Thêm chi tiết


29
Tôi nên đề cập rằng các chuỗi đã được lưu trữ trước đây được lưu trữ trong không gian PermGen, nhưng đã được chuyển sang vùng Java chính trong Java 7.
gparyani

Cảm ơn vì lời giải thích chi tiết.
Pradeep

3
Một chút giới thiệu nhẹ nhàng cho khán giả nói chung (ý tôi là chủ yếu là những người không phải Java, ví dụ: các tín đồ đồng nghiệp phải đối phó với JVM) sẽ không gây hại trong câu trả lời này.
ulidtko

117

Đây là một trong những tính năng mới của Java 8, một phần của Đề xuất nâng cao JDK 122 :

Loại bỏ thế hệ vĩnh viễn khỏi JVM Hotspot và do đó cần điều chỉnh kích thước của thế hệ vĩnh viễn.

Danh sách tất cả các JEP sẽ được bao gồm trong Java 8 có thể được tìm thấy trên trang các cột mốc JDK8 .


19

Không gian thế hệ vĩnh viễn (PermGen) đã bị xóa hoàn toàn và được thay thế bằng một không gian mới gọi là Metaspace. Hậu quả của việc xóa PermGen là rõ ràng các đối số JVM của PermSize và MaxPermSize bị bỏ qua và bạn sẽ không bao giờ gặp phải java.lang.OutOfMemoryErrorlỗi: PermGen. JVM JDK 8 HotSpot hiện đang sử dụng bộ nhớ riêng để biểu diễn siêu dữ liệu lớp và được gọi là Metaspace. Đọc thêm >>


3
'HotSpot JVM hiện đang sử dụng bộ nhớ riêng để biểu diễn siêu dữ liệu lớp. - và bộ nhớ HotSpot JVM đã sử dụng trước đây là gì? Và exaclty 'bộ nhớ bản địa' là gì?
Andrey M. Stepanov


12

Không gian PermGen được thay thế bởi MetaSpace trong Java 8. Các đối số JVM PermSize và MaxPermSize bị bỏ qua và cảnh báo được đưa ra nếu có khi khởi động.

Hầu hết các phân bổ cho siêu dữ liệu lớp hiện được phân bổ ra khỏi bộ nhớ riêng. * Các lớp được sử dụng để mô tả siêu dữ liệu lớp đã bị xóa.

Sự khác biệt chính giữa PermGen cũ và MetaSpace mới là, bạn không phải bắt buộc xác định giới hạn trên của việc sử dụng bộ nhớ. Bạn có thể giữ giới hạn không gian MetaSpace không giới hạn. Do đó, khi mức sử dụng bộ nhớ tăng lên, bạn sẽ không gặp phải lỗi OutOfMemoryError. Thay vào đó, bộ nhớ riêng dành riêng được tăng lên để lấp đầy toàn bộ mức tăng sử dụng bộ nhớ.

Bạn có thể xác định giới hạn không gian tối đa cho MetaSpace, và sau đó nó sẽ ném ra OutOfMemoryError: Không gian siêu dữ liệu. Do đó, điều quan trọng là xác định giới hạn này một cách thận trọng, để chúng ta có thể tránh lãng phí bộ nhớ.


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.