2012-03-21 8 views
10

Necesito probar algunas secuencias de comandos de supervisión JMX que he desarrollado. En particular, me gustaría verificar que mi supervisión de la región PermGen esté funcionando. Entonces, para probar esto, me gustaría poder ejecutar un poco de código que cargue una cantidad significativa de clases para consumir PermGen.Rellenar programáticamente la región de memoria de generación permanente de JVM (PermGen)

Mi plan actual es escribir un script para generar prefix(1..n).java compilarlas y luego en el momento justo de ejecución:

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

¿Hay una solución más elegante para lograr esto?

+0

Creo que si se instancia un nuevo cargador de clases y cargar la misma clase y otra vez, que alcanzará su objetivo sin la necesidad de crear toneladas de diferentes clases. Alternativamente, creo que String.intern() también puede llenar tu espacio PermGen –

+0

@Guillaume: ¡eso es una respuesta, no un comentario! –

+0

@Tom, sí y no porque no estoy seguro de esto, así que esto es más una sugerencia. No quiero parecer afirmativo en esto. ;-) –

Respuesta

10

Bien, parece que String.intern() hará el truco. Aquí hay una implementación que encontré. Créditos va a Gareth así:

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

Buena solución. El bit que me sorprendió la primera vez es que a menos que retenga una referencia a la secuencia interna, el GC simplemente vaciará las cadenas de PermGen en el FullGC que eventualmente forzará. –

Cuestiones relacionadas