Cụ thể, tại sao nó sẽ giúp khắc phục sự cố PermGen OutOfMemoryError?
Ngoài ra, điểm thưởng cho một câu trả lời chỉ cho tôi tài liệu về các đối số JVM ...
Cụ thể, tại sao nó sẽ giúp khắc phục sự cố PermGen OutOfMemoryError?
Ngoài ra, điểm thưởng cho một câu trả lời chỉ cho tôi tài liệu về các đối số JVM ...
Câu trả lời:
Không gian cố định là nơi các lớp, phương thức, chuỗi nội bộ và các đối tượng tương tự được sử dụng bởi VM được lưu trữ và không bao giờ bị hủy bỏ (do đó là tên).
Bài viết này của Oracle trình bày ngắn gọn về hoạt động và tham số hóa của HotSpot GC và khuyên bạn nên tăng dung lượng này nếu bạn tải nhiều lớp (đây thường là trường hợp cho các máy chủ ứng dụng và một số IDE như Eclipse):
Thế hệ vĩnh viễn không có tác động đáng chú ý đến hiệu suất của bộ thu gom rác đối với hầu hết các ứng dụng. Tuy nhiên, một số ứng dụng tự động tạo và tải nhiều lớp; ví dụ, một số triển khai của các trang JavaServer Pages (JSP). Các ứng dụng này có thể cần một thế hệ vĩnh viễn lớn hơn để giữ các lớp bổ sung. Nếu vậy, kích thước tạo vĩnh viễn tối đa có thể được tăng lên với tùy chọn dòng lệnh -XX: MaxPermSize =.
Lưu ý rằng tài liệu Oracle khác này liệt kê các đối số HotSpot khác.
Cập nhật: Bắt đầu với Java 8, cả không gian permgen và cài đặt này đều biến mất. Mô hình bộ nhớ được sử dụng cho các lớp và phương thức được tải là khác nhau và không bị giới hạn (với cài đặt mặc định). Bạn không nên thấy lỗi này nữa.
-XX:PermSize -XX:MaxPermSize
được sử dụng để đặt kích thước cho Thế hệ vĩnh viễn.
Thế hệ vĩnh viễn: Thế hệ vĩnh viễn là nơi lưu giữ các tệp lớp. Đây là kết quả của các lớp được biên dịch và các trang JSP. Nếu không gian này đầy, nó sẽ kích hoạt Bộ sưu tập Rác đầy đủ. Nếu Bộ sưu tập Rác đầy đủ không thể dọn sạch các lớp cũ không được ước tính và không còn chỗ để mở rộng Không gian cố định, lỗi Out Bộ nhớ (OOME) sẽ bị ném và JVM sẽ bị sập.
Trong Java 8, tham số đó thường được sử dụng để in một thông báo cảnh báo như thế này:
Cảnh báo máy chủ 64-bit Java HotSpot (TM): bỏ qua tùy chọn MaxPermSize = 512m; hỗ trợ đã bị xóa trong 8.0
Lý do tại sao bạn nhận được thông báo này trong Java 8 là vì Permgen đã được thay thế bởi Metaspace để giải quyết một số nhược điểm của PermGen (như bạn có thể tự mình nhìn thấy, một trong những nhược điểm đó là nó có kích thước cố định).
FYI: một bài viết về Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html