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在哪的理由。。。等更新~
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在哪的理由。。。等更新~
相关文章推荐
- String.intern节省内存空间或内存溢出
- 关于java基础类型与引用类型内存存储问题,以及string.intern()方法(String两种创建方式的区别)
- 关于 String的intern() 的用途 及简单测试
- Sun Java HotSpot™ Virtual Machine内存模型与垃圾回收
- 关于java处理内存泄露与内存溢出的学习总结
- 使用String.intern减少内存使用
- 关于内存溢出
- 关于sdk为m5_rc15时出现内存溢出的调查
- 使用String.intern减少内存使用
- 关于JAVA内存溢出问题
- 关于Java内存溢出的一些思考
- Java中,String的subString方法易导致内存溢出
- String.Intern原来可以减少占用内存···
- 关于Android Application 内存溢出问题的总结
- 关于图片的内存溢出
- 关于String中的intern方法(15章的进一步解释)
- 关于Java中String内存的学习
- 关于Myclipse和Jboss调试过程中内存溢出问题的解决
- 一个关于string 内存的问题
- 关于java中String 的内存解析