2012-03-21 9 views
10

Muszę przetestować niektóre skrypty monitorowania JMX, które opracowałem. W szczególności chciałbym sprawdzić, czy moje monitorowanie regionu PermGen działa. Aby przetestować to, chciałbym móc uruchomić trochę kodu, który ładuje znaczną liczbę klas w celu konsumowania PermGen.Programowe wypełnienie obszaru pamięci stałej Perm (PermGen) JVM

Mój obecny plan jest napisać skrypt do generowania prefix(1..n).java skompilować je, a następnie na komendę RUN:

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

Czy istnieje bardziej eleganckie rozwiązanie do osiągnięcia tego celu?

+0

myślę, że jeśli wystąpienie nowego ClassLoader i załadować tę samą klasę w kółko, że osiągnie swój cel bez konieczności tworzenia ton różnych klas. Alternatywnie, myślę, że String.intern() może również wypełnić swoją przestrzeń PermGen –

+0

@Guillaume: to odpowiedź, a nie komentarz! –

+0

@Tom, tak i nie, ponieważ nie jestem tego pewien, więc jest to bardziej sugestia. Nie chcę tego potwierdzać. ;-) –

Odpowiedz

10

OK, więc wygląda na String.intern(). Oto jedna z realizacji, którą znalazłem. Kredyty idzie do Gareth także:

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

Dobre rozwiązanie. Ten kawałek, który zaskoczył mnie po raz pierwszy, polega na tym, że dopóki nie zatrzymasz odniesienia do internowanej struny, GC po prostu opróżni struny z PermGen na FullGC, które ostatecznie zmusisz. –

Powiązane problemy