验证Java8后,字符串常量池在堆中
作者:神秘网友
发布时间:2020-09-23 03:41:47
验证Java8后,字符串常量池在堆中
验证Java8后,字符串常量池在堆中本次测试的JDK版本为:
测试代码:
import java.util.HashSet; import java.util.Set; public class 验证字符串常量池在堆中 { public static void main(String[] args) { //保持对象引用,防止被GC Set<String> set = new HashSet<String>(); long i = 0; while (true) { System.out.println(i); //使用intern()方法是因为该方法可以实现运行时新增常量入字符串常量池,这样常量池占用的空间就会不断变大,直至内存溢出 set.add(String.valueOf(i++).intern()); } } }
Java8使用了元空间替代了永久代,而Java8之前的字符串常量池是存放在永久代中的,所以这次测试先调整下元空间的大小,对应的虚拟机运行参数如下:
-XX:MaxMetaspaceSize=10M
运行结果如下:
发现运行到了13万多,还没抛出异常。
接下来修改堆大小,对应的虚拟机运行参数如下:
-Xmx10m -Xms10m -XX:-UseGCOverheadLimit
运行结果如下:
可以发现,只运行到了8万多,堆就抛出了OutOfMemoryError异常。
总结
通过调整元空间和堆大小,来比较程序的运行结果,可以得出Java8后,字符串常量池被存放在堆中。