JVM:关于常量池溢出的问题(JDK1.8为什么没有常量池溢出?)

1.声明

由于本人初次学习JVM,所以有点困惑,在JDK1.8中是否存在常量池溢出这个问题?本人按照《深入理解Java虚拟机:JVM高级特性与最佳实践》这本书的方法区和常量池溢出这里感到困惑,以此写下博客记录当前的疑惑!

2.本人当前的环境

在这里插入图片描述
本人使用jdk1.8并且虚拟机为HotSpot™ 64-Bit Server VM,当前使用的模式为 mixed mode,当前系统Win10 64位

3.本人测试的代码

/**
 * @description 用于测试当前的运行时常量池出现的错误
 * @author hy
 * @date 2020-02-21
 */
public class RuntimeConstPoolErrorTest {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		int i = 0;
		while (true) {
			list.add(String.valueOf(i++).intern());
			System.out.println(i);
		}
	}
}

本人使用的VM参数为:
在这里插入图片描述
-XX:PermSize=10m -XX:MaxPermSize=10m

4.运行结果

在这里插入图片描述
本人执行了40到50秒,没有发现当前的常量池溢出,还有书上面的PermGen space,和OutOfMemoryError这个异常

由于本人开始查找资料发现,JDK1.8中的内容,原因是:当前的参数有问题!

在这里插入图片描述
由于本人的只有前面两个参数,当前的程序并没有停止下来,但是这个地方却停止下来并抛出异常,所以本人觉得可能是这两个地方的问题!所以本人觉得-XX:PermSize=10m -XX:MaxPermSize=10m这两个参数可能没有任何作用!

5.修改当前的VM参数,再运行

在这里插入图片描述
结果出现了:Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded这个错误,表示GC回收问题

在这里插入图片描述

根据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.”,实际上就是GC回收的内存太少了,没有内存涨的快,大多数产生了不可回收的内存数据

6.使用打印GC方式显示每次的GC

添加打印GC的参数
在这里插入图片描述

运行的结果:
在这里插入图片描述
发现在出现这个OutOfMemoryError之前出现过以此GC操作:

[Full GC (Ergonomics) [PSYoungGen: 1024K->1024K(2048K)] [ParOldGen: 7043K->7042K(7168K)] 8067K->8066K(9216K), [Metaspace: 2698K->2698K(1056768K)], 0.0309281 secs] [Times: user=0.23 sys=0.00, real=0.03 secs]

但是这次GC操作在年轻代居然没有任何的垃圾回收,在老年代之回收了1K,导致GC无法回收当前的内存,出现内存溢出的情况

7.总结

1.通过上面的GC发现所有的String.valueOf(i++).intern()所产生的数据,在于年轻代和老年代,这些数据只会向老年代前进(这个intern()方式产生的常量)当前的年轻代和老年代是存在于堆中的,所以结论就是常量池在JDK1.8中被改进了(被迁移到了堆中)

2.通过上面的测试发现书本上的数据只能针对那本书的环境,可能在不同的版本中出现不同的差异

3.当前的1.8中VM参数:-XX:PermSize=10m -XX:MaxPermSize=10m不能控制常量池的大小(方法区中没有运行时常量池了)

4.当前的JDK1.8是通过修改-Xms10M -Xmx10M这个堆的大小参数来修改常量的大小,并且常量会快速向老年代移动

以上纯属个人见解,如有问题请联系本人!

发布了221 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45492007/article/details/104427204