您的位置:首页 > 编程语言 > Java开发

jdk1.7 sun hotspot关于string.intern()内存溢出

2015-04-07 15:18 435 查看
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
在java中有constantPool常量池,常量池里存放的是类,方法,接口的等常量,而对于存放字符串常量通常存放的符号链接Symbol 或者真实的String的对象的引用。
http://blog.csdn.net/raintungli/article/details/38595573
开始测试:参数-XX:MaxDirectMemorySize=10m -Xmx20M

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)

啊哈,溢出了~
但是
4000
它报的错误都是跟array有关的,没有

at java.lang.String.intern(Native Method)  

我还在继续找能说明intern string在哪的理由。。。等更新~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息