2012-03-21 12 views
10

Geliştirdiğim bazı JMX izleme komut dosyalarını test etmeliyim, özellikle PermGen bölgesini izlememin çalıştığını doğrulamak istiyorum. Bunu test etmek için PermGen'i tüketmek için önemli sayıda ders yükleyen bir kod çalıştırmak istiyorum.JVM Kalıcı Nesil (PermGen) bellek bölgesini programlı olarak doldurun

Bulunduğum planı bir komut dosyası prefix(1..n).java bunları derlemek üretmek için yazmaktır ve daha sonra işaret kaçak:

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

bunu başarmak için daha şık bir çözüm var mı?

+0

Sana yeni ClassLoader örneğini ve tekrar tekrar aynı sınıfı yüklerseniz, farklı sınıfların ton oluşturmaya gerek kalmadan hedefinize ulaşmak olacağını düşünüyorum. Alternatif olarak, String.intern() 'in de PermGen alanınızı –

+0

@Guillaume doldurabileceğini düşünüyorum: bu bir cevap değil, bir yorum! –

+0

@ Tom, evet ve hayır çünkü bundan emin değilim, bu yüzden bu bir öneridir. Bu konuda olumlu görünmek istemiyorum. ;-) –

cevap

10

Tamam, String.intern() gibi görünüyor hile yapacaktır. İşte bulduğum bir uygulama. Kredi yanı Gareth gider:

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

Güzel çözüm. Beni ilk kez yakalayan bit, dahili dizgeye bir atıfta bulunmadığınız sürece, GC'nin, tam olarak zorlayacağınız FullGC'deki PermGen dizilerini boşaltacağıdır. –