Java 以编程方式填充JVM永久生成(PermGen)内存区域

Java 以编程方式填充JVM永久生成(PermGen)内存区域,java,classloader,permgen,Java,Classloader,Permgen,我需要测试我开发的一些JMX监控脚本,特别是我想验证我对PermGen区域的监控是否有效。所以为了测试这一点,我希望能够运行一些代码,加载大量的类来使用PermGen 我目前的计划是编写一个脚本来生成前缀(1..n)。java编译它们,然后按提示运行: for( int i=1 ; i < n ; i ++){ Class.forName("com.mypackage.prefix"+i); } for(int i=1;i

我需要测试我开发的一些JMX监控脚本,特别是我想验证我对PermGen区域的监控是否有效。所以为了测试这一点,我希望能够运行一些代码,加载大量的类来使用PermGen

我目前的计划是编写一个脚本来生成
前缀(1..n)。java
编译它们,然后按提示运行:

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

有没有更优雅的解决方案来实现这一点?

好的,看来String.intern()就可以了。这里是我发现的一个实现。加雷斯也获得了荣誉:

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);
    }
}
publicstaticvoidmain(字符串[]args)抛出ClassNotFoundException{
int i=0;
StringBuilder sb=新StringBuilder(“a”);
对于(i=0;i<20;i++){
sb.附加(sb.toString());
}
System.err.println(sb.length());
i=0;
Set strings=newhashset();
while(true){
strings.add(sb.append(i++).toString().intern());
系统错误println(i);
}
}

我认为,如果您实例化一个新的类加载器并反复加载同一个类,它将达到您的目标,而无需创建大量不同的类。或者,我认为String.intern()也可以填充PermGenspace@Guillaume:这是回答,不是评论@汤姆,是和否,因为我不确定这一点,所以这更像是一个建议。我不想在这件事上显得肯定@纪尧姆:呜!内存泄漏已成功创建String.intern()…工作正常。。。一条完全破碎的玻璃鱼!(一开始并不奏效)。您想将其添加为问题的答案
前缀(1..n)。java
应该是
前缀(1..n)。类
,不是吗?很好的解决方案。我第一次意识到的一点是,除非您保留对插入字符串的引用,否则GC只会清空FullGC上PermGen的字符串,您最终将强制执行这些字符串。