- 首先明确:只有HotSpot虚拟机才有永久代。其他虚拟机是不存在永久代的概念 。
- HotSpot中 方法区的变化:
版本 | 变化 |
---|---|
jdk1.6及以前 | 有永久代(占用JVM内存),静态变量存放在永久代里,字符串常量池在运行时常量池中 |
jdk1.7 | 有永久代,但已经逐步“去永久代”,字符串常量池、静态变量移出,保存在堆中 |
jdk1.8及以后 | 无永久代,类型信息、字段、方法、运行时常量池保存在本地内存的元空间,但字符串常量池、静态变量仍在堆中 |
注意:静态变量是指“static Object obj=new Object()”中的obj变量,而不是new的对象。
永久代为什么被元空间替换 ?
(1)为永久代设置空间大小是很难确定的。在某些场景下,如果动态加载类过多,容易产生OOM。而元空间和永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此 ,默认情况下,元空间的大小仅受本地内存限制。
(2)对永久代进行调优是很困难的。
(3)替换成元空间也能够避免频繁的进行Full GC。