tôi có mã này để tạo lớp tự động và tải nóJava8 metaspace & đống sử dụng
import javassist.CannotCompileException;
import javassist.ClassPool;
public class PermGenLeak {
private static final String PACKAGE_NAME = "com.jigarjoshi.permgenleak.";
public static void main(String[] args) throws CannotCompileException, InterruptedException {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
ClassPool pool = ClassPool.getDefault();
pool.makeClass(PACKAGE_NAME + i).toClass();
Thread.sleep(3);
}
}
}
tôi đưa ra lớp này chống lại Java 7 (jdk1.7.0_60) và như mong đợi nó lấp đầy PermGenSpace và đống vẫn chưa sử dụng hình ảnh cho thấy PermGen thêm giờ sử dụng và tại các JVM cuối đã được chấm dứt
Bây giờ cùng mã chạy chống Java 8 (jdk1.8.0_40-ea) và như mong đợi nó giữ mở rộng bộ nhớ quê hương (Metaspace) nhưng đáng ngạc nhiên cho 1g Metaspace tiêu thụ 3g Heap trong OldGen (almos t 3x của Metaspace duy trì theo thời gian)
hình ảnh cho thấy việc sử dụng Metaspace thêm giờ và hệ thống mẫu sử dụng bộ nhớ
this email from Jon Masamitsu và this JEP ticket nói
thực tập nội trú
String
và lớp số liệu thống kê và một số dữ liệu misc có đã được chuyển đến Heap
chính xác những gì làm cho sự gia tăng này trong đống như nó tải thêm các lớp học vào Metaspace?
Cảm ơn Andrei, tôi nên đã thực hiện điều này, tôi nghĩ rằng tôi đã không đạt được ở quy mô này trong ví dụ Java 7 đó là lý do tại sao tôi đã không nhìn thấy nó trong Java 7 –