1 JDK7和JDK8将字符串常量池存放在了堆中
字符串常量池string pool中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中存放的,string pool实现为哈希表。
测试字符串常量池
public class TestStringPool { //-Xms5m -Xmx5m -XX:-UseGCOverheadLimit //设置最大堆内存和初始堆内存都是5M, //-XX:-UseGCOverheadLimit的目的是关闭检查防止抛出GC overhead limit exceeded //超过98%的时间用来做GC并且回收了不到2%的堆内存,会抛出GC overhead limit exceeded public static void main(String[] args) { String str = "abc"; char[] array = {‘a‘, ‘b‘, ‘c‘}; String str2 = new String(array); //使用intern()将str2字符串内容放入常量池 str2 = str2.intern(); //这个比较用来说明字符串字面常量和我们使用intern处理后的字符串是在同一个地方 System.out.println(str == str2); //那好,下面我们就拼命的intern吧 ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < 50000000; i++) { System.out.println(i); String temp = String.valueOf(i).intern(); list.add(temp); } } }
运行一段时间后会抛出堆内存溢出:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
2
原文:https://www.cnblogs.com/moris5013/p/11050503.html