JVM方法区在JDK6、JDK7、JDK8变化

1.这是针对于HotSpot而言;

2.Hotspot中方法区的变化:

JDK1.6及之前 有永久代,字符串常量池、静态变量存放在永久代上
JDK1.7 有永久代,但已经逐步”去永久代“,字符串常量池、静态变量以及保存在堆中了。
JDK1.8及之后 无永久代,类型信息、字段、方法、常量保存在本地内存的元空间,但字符串常量池、静态变量仍在堆中

方法区中存储什么?

《深入理解Java 虚拟机》书中对方法区存储内容描述如下:它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。

JVM方法区在JDK6、JDK7、JDK8变化

JVM方法区在JDK6、JDK7、JDK8变化

JVM方法区在JDK6、JDK7、JDK8变化

永久代为什么要被元空间替换

1.在某些场景下,如果动态加载类过多,容易产生Perm区的OOM。比如某个实际Web工程中,因为功能点比较多,在运行过程中,要不断动态加载很多类,经常出现致命错误。

java.lang.OutOfMemoryError:PermGen

而元空间和永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。

2.对永久代进行调优是很困难的。