jvm_内存溢出_运行时常量池溢出
2015-03-11 22:15
197 查看
如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法。该方法的作用是:如果池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。由于常量池分配在方法区内,我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中常量池的容量。
例:
书上的运行结果为:
Exception in thread “main” java.lang.OutOfMemoryError: PermGen space
at java.lang.String.intern(Native Method)
……
而我在JDK7运行结果为:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
at java.lang.StringBuilder.append(StringBuilder.java:132)
at jvm.RuntimeConstantPoolOOM.main(RuntimeConstantPoolOOM.java:18)
说明JDK7 中,intern的字符串放在堆中,不会放入方法区。
例:
package jvm; import java.util.ArrayList; import java.util.List; /** * -XX:PermSize=10M -XX:MaxPermSize=10M * * @author Poison * */ class RuntimeConstantPoolOOM { public static void main(String[] args) { // 使用List保持着常量池引用,避免Full GC回收常量池行为 List<String> list = new ArrayList<String>(); String str="1234567890"; while (true) { str=str+str; list.add(str.intern()); } } }
书上的运行结果为:
Exception in thread “main” java.lang.OutOfMemoryError: PermGen space
at java.lang.String.intern(Native Method)
……
而我在JDK7运行结果为:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
at java.lang.StringBuilder.append(StringBuilder.java:132)
at jvm.RuntimeConstantPoolOOM.main(RuntimeConstantPoolOOM.java:18)
说明JDK7 中,intern的字符串放在堆中,不会放入方法区。
相关文章推荐
- JVM笔记3-java内存区域之运行时常量池
- JVM 内存基础概念之 方法区和运行时常量池
- Java基础--jvm(内存区域与内存溢出异常--运行时数据区域)
- myeclipse----JVM运行内存溢出问题解决
- myeclipse----JVM运行内存溢出问题解决
- jvm常见运行时内存溢出实现方式
- JVM-由常量池 运行时常量池 String intern方法想到的(三)之String内存模型
- JVM内存模型之运行时常量池
- Windows下的weblogic部署web项目运行比较慢或内存溢出,需要调整内存大小
- JVM内存溢出的几种情形
- Tomcat中JVM内存溢出及合理配置
- Tomcat中JVM内存溢出及合理配置
- JVM运行时的内存区域
- Tomcat中JVM内存溢出及如何合理配置
- jvm内存溢出解决方法(jvm内存溢出怎么解决)
- Java内存区域与内存溢出异常——运行时数据区域
- Eclipse中通过Tomcat运行JavaWeb项目发生内存溢出:java.lang.OutOfMemoryError: PermGen space 错误的解决方案
- MyEclipse 2015 运行tomcat 内存溢出的解决方法
- [转]JVM内存溢出的几种方式比较
- jvm 内存溢出 在myeclipse中加大tomcat的jvm内存 java.lang.OutOfMemoryError: PermGen space