2012-03-21 17 views
10

Tôi cần kiểm tra một số kịch bản giám sát JMX mà tôi đã phát triển, Đặc biệt tôi muốn xác minh rằng việc giám sát vùng PermGen của tôi đang hoạt động. Vì vậy, để kiểm tra điều này, tôi muốn có thể chạy một chút mã tải một số lượng đáng kể các lớp để tiêu thụ PermGen.Lập trình điền vùng nhớ JVM Permanent Generation (PermGen)

kế hoạch hiện tại của tôi là viết một kịch bản để tạo prefix(1..n).java biên dịch chúng và sau đó có mặt đúng lúc chạy:

for(int i=1 ; i < n ; i ++){ 
    Class.forName("com.mypackage.prefix"+i); 
} 

Có một giải pháp thanh lịch hơn để đạt được điều này?

+0

Tôi nghĩ rằng nếu bạn tạo một ClassLoader mới và nạp cùng lớp hơn và hơn, nó sẽ đạt được mục tiêu của mình mà không cần phải tạo ra tấn của các tầng lớp khác nhau. Ngoài ra, tôi nghĩ rằng String.intern() cũng có thể điền vào không gian PermGen của bạn –

+0

@Guillaume: đó là một câu trả lời, không phải là một bình luận! –

+0

@Tom, có và không vì tôi không chắc chắn về điều này, vì vậy đây là một gợi ý. Tôi không muốn khẳng định điều này. ;-) –

Trả lời

10

OK, có vẻ như String.intern() sẽ thực hiện thủ thuật. Đây là một trong những thực hiện tôi tìm thấy. Tín đi vào Gareth cũng như:

public static void main(String[] args) throws ClassNotFoundException { 
    int i = 0; 
    StringBuilder sb = new StringBuilder("a"); 
    for (i = 0; i < 20; i++) { 
     sb.append(sb.toString()); 
    } 
    System.err.println(sb.length()); 
    i = 0; 
    Set<String> strings = new HashSet<String>(); 
    while (true) { 
     strings.add(sb.append(i++).toString().intern()); 
     System.err.println(i); 
    } 
} 
+0

Giải pháp tốt. Các bit mà bắt gặp tôi ra lần đầu tiên là trừ khi bạn giữ lại một tham chiếu đến chuỗi interned GC sẽ chỉ đơn giản là rỗng các chuỗi từ PermGen trên FullGC mà bạn cuối cùng sẽ buộc. –

Các vấn đề liên quan