验证Java8后,字符串常量池在堆中

作者:神秘网友 发布时间:2020-09-23 03:41:47

验证Java8后,字符串常量池在堆中

验证Java8后,字符串常量池在堆中

本次测试的JDK版本为:

验证Java8后,字符串常量池在堆中

测试代码:

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

运行结果如下:
验证Java8后,字符串常量池在堆中
发现运行到了13万多,还没抛出异常。

接下来修改堆大小,对应的虚拟机运行参数如下:

-Xmx10m -Xms10m  -XX:-UseGCOverheadLimit

运行结果如下:验证Java8后,字符串常量池在堆中
可以发现,只运行到了8万多,堆就抛出了OutOfMemoryError异常。

总结

通过调整元空间和堆大小,来比较程序的运行结果,可以得出Java8后,字符串常量池被存放在堆中。

验证Java8后,字符串常量池在堆中相关教程

  1. Python字符串的格式化输出,简简单单理解一哈
  2. CNN深度神经网络实现验证码识别
  3. 403,验证二叉搜索树
  4. 堆参数调优入门
  5. 【LeetCode(Java) - 1065】字符串的索引对
  6. Redis字符串底层解析
  7. C实现字符串排序操作
  8. vue使用云片滑块验证码