Metaspace là vùng chứa metadata của class (cấu trúc class, method, constant pool đã phân giải), thay cho PermGen từ Java 8 (JEP 122).
| PermGen (≤ Java 7) | Metaspace (Java 8+) | |
|---|---|---|
| Vị trí | nằm trong heap | native memory, ngoài heap |
| Kích thước | cố định theo -XX:MaxPermSize | tự tăng, mặc định không giới hạn |
| Cờ chỉnh | -XX:PermSize | -XX:MaxMetaspaceSize |
Lý do đổi: PermGen có trần cố định nên rất dễ tràn khi ứng dụng nạp nhiều class (framework sinh proxy, JSP compile...), mà chỉnh trần thì phải đoán trước. Metaspace lấy từ native memory và tự nới.
Metadata được giải phóng khi classloader nạp nó không còn tới được — cả cụm class của loader đó bị unload cùng lúc.
OutOfMemoryError: Metaspace thường do:
- Classloader leak — hot redeploy nhiều lần trên Tomcat, loader cũ vẫn bị một static field hoặc ThreadLocal giữ, không unload được.
- Sinh class động không kiểm soát (proxy, bytecode generation trong vòng lặp).
Đặt -XX:MaxMetaspaceSize để lỗi xuất hiện sớm và có chủ đích, thay vì để Metaspace ăn hết RAM máy rồi bị OS kill.