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

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)


啊哈,溢出了~

但是它报的错误都是跟array有关的,没有

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

我还在继续找能说明intern string在哪的理由。。。等更新~





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值