public class RunTimeContantPoolOOM {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
int i = 0;
while(true){
list.add(String.valueOf(i++).intern());
}
}
这是测试代码。。。没什么,,,就是周志明书上56页的例子。jdk1.6及以前由于方法区按永久代处理了,所以设置永久代参数后会报PermGen space错误。。。这是众所周知的我就不说了。。。
jdk1.7后,
- interned String => Java heap
- Symbols => native memory
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.Integer.toString(Integer.java:331)
at java.lang.String.valueOf(String.java:2952)
at runtime.RunTimeContantPoolOOM.main(RunTimeContantPoolOOM.java:13)
问题产生原因:
根据sun的说法: "if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown."
jvm gc行为中超过98%以上的时间去释放小于2%的堆空间时会报这个错误。
当我的参数设成:-Xmx10M -Xms10M
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2245)
at java.util.Arrays.copyOf(Arrays.java:2219)
at java.util.ArrayList.grow(ArrayList.java:242)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)
at java.util.ArrayList.add(ArrayList.java:440)
at runtime.RunTimeContantPoolOOM.main(RunTimeContantPoolOOM.java:13)
啊哈,溢出了~
但是它报的错误都是跟array有关的,没有
- at java.lang.String.intern(Native Method)