JVM方法区在JDK6、JDK7、JDK8变化
1.这是针对于HotSpot而言;
2.Hotspot中方法区的变化:
JDK1.6及之前 | 有永久代,字符串常量池、静态变量存放在永久代上 |
JDK1.7 | 有永久代,但已经逐步”去永久代“,字符串常量池、静态变量以及保存在堆中了。 |
JDK1.8及之后 | 无永久代,类型信息、字段、方法、常量保存在本地内存的元空间,但字符串常量池、静态变量仍在堆中 |
方法区中存储什么?
《深入理解Java 虚拟机》书中对方法区存储内容描述如下:它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。
永久代为什么要被元空间替换
1.在某些场景下,如果动态加载类过多,容易产生Perm区的OOM。比如某个实际Web工程中,因为功能点比较多,在运行过程中,要不断动态加载很多类,经常出现致命错误。
java.lang.OutOfMemoryError:PermGen
而元空间和永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。
2.对永久代进行调优是很困难的。