因为我没能参加课程,所以昨天我做了几个小时的研究,这就是我目前的进展。
首先我创建了一个程序,但我不断地得到这个错误:
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空间错误的算法)
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堆空间错误。
我知道我没有参加讲座是我的错,但我需要一些帮助来理解我在这里做错了什么或者我漏掉了什么?