这是功课,不会撒谎。我需要编写一个程序来生成“java.lang.OutOfMemoryError: PermGen space”错误。
由于我无法参加讲座,所以我昨天做了几个小时的研究,这就是我到目前为止所做的。
起初我创建了一个程序,但我经常遇到这个错误:
java.lang.OutOfMemoryError: GC overhead limit exceeded
好的,所以我做了更多的研究并了解到我没有收到 PermGen 错误,因为虽然我创建了对象(字符串对象)我没有再次使用它们,所以它们被认为是垃圾。所以我改变了我的代码并不断得到这个:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
所以这是我当时的代码:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> test = new ArrayList<String>();
test.add(new String(""));
for (;;) {
for (int i = 0; i<test.size(); i++){
test.add(test.get(i));
}
}
}
}
同样在 VM 参数下,我有“-XX:PermSize=2m”(我尝试了不同的值)。有人告诉我我的代码是错误的,因为它一遍又一遍地使用相同的字符串。所以我试图改变这一点,但我仍然没有成功。然后我找到了这段代码:(导致 java.lang.OutOfMemoryError: PermGen space error 的算法)
Random rnd = new Random();
List<String> interned = new ArrayList<String>();
for (;;) {
int length = rnd.nextInt(100);
StringBuilder builder = new StringBuilder();
String chars = "abcdefghijklmnopqrstuvwxyz";
for ( int i = 0; i < length; i++ ) {
builder.append(chars.charAt(rnd.nextInt(chars.length())));
}
interned.add(builder.toString().intern());
}
所以如果我理解正确,这应该给我 PermGen 错误?但我仍然得到java堆错误。
我也发现了这个:http: //javaeesupportpatterns.blogspot.com/2011/10/java-7-features-permgen-removal.html 如果我理解正确,那么在使用 java7 时可能 java 堆空间错误是我的错误应该得到?不再可能出现 PermGen 错误?好的,所以我尝试将编译器和项目版本更改为 java 6。但仍然出现 Java 堆空间错误。
我知道我没有参加讲座是我的错,但我可以使用一些帮助来了解我在这里做错了什么或者我错过了什么?