为什么使用元空间替代永久代作为方法区的实现?

Java虚拟机规范对方法区的实现进行了改变,这是出于客观和主观两方面的原因。

从客观上看,使用永久代来实现方法区带来了一些问题。永久代的设计决策导致Java应用程序更容易遭遇内存溢出问题。永久代有一个最大值限制(通过-XX:MaxPermSize设置),即使不显式设置,也有默认大小。而且一些特定的方法(例如String::intern())由于永久代的存在,在不同的虚拟机下表现不同。

主观上,当Oracle收购BEA并获得JRockit的所有权后,他们希望将JRockit中的优秀功能(例如Java Mission Control管理工具)移植到HotSpot虚拟机。然而,由于两者在方法区实现上的差异,遇到了许多困难。考虑到HotSpot的未来发展,HotSpot开发团队在JDK 6时就已经计划放弃永久代,逐步改为使用本地内存(Native Memory)来实现方法区。在JDK 7的HotSpot中,已经将原本放在永久代中的字符串常量池、静态变量等移出。而在JDK 8中,终于彻底废弃了永久代的概念,采用与JRockit和J9相同的元空间(Metaspace)在本地内存中实现。JDK 8将永久代中剩余的内容(主要是类型信息)全部迁移到了元空间中。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题