Java 官方在 JEP 122: Remove the Permanent Generation(移除永久代)中给出了答案,原文内容如下:

Motivation(动机) This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.

以上内容翻译成中文大意是:

这是 JRockit 虚拟机和 HotSpot 虚拟机融合工作的一部分。JRockit 客户不需要配置永久层代(因为 JRockit 没有永久代),所以要移除永久代。

JRockit 是 Java 官方收购的一家号称史上运行最快的 Java 虚拟机厂商,之后 Java 官方在 JDK 8 时将 JRockit 虚拟机和 HotSpot 虚拟机进行了整合。

PS:JEP 是 JDK Enhancement Proposal 的缩写,翻译成中文是 JDK 改进提案。你也可以把它理解为 JDK 的更新文档。

通过官方的描述,我们似乎找到了答案,也就是说,之所以要取消“永久代”是因为 Java 官方收购了 JRockit,之后在将 JRockit 和 HotSpot 进行整合时,因为 JRockit 中没有“永久代”,所以把永久代给移除了

元空间优点

相比于永久代,元空间具有更好的灵活性和扩展性,可以更好地满足不同应用程序的需求。 永久代的大小是固定的,当加载的类信息、常量池等数据超过了永久代的大小时,就会导致内存溢出。而元空间的大小可以根据需要进行调整,不再受到固定大小的限制。同时,元空间的数据可以存储在本地内存中,不再受到 Java 堆大小的限制。因此,使用元空间替代永久代可以提高程序的灵活性和稳定性。 所以,元空间的优势主要体现在以下两点:

1.提高稳定性,降低 OOM

当使用永久代实现方法区时,永久代的最大容量受制于 PermSize 和 MaxPermSize 参数设置的大小,而这两个参数的大小又很难确定,因为在程序运行时需要加载多少类是很难估算的,如果这两个参数设置的过小就会频繁的触发 FullGC 和导致 OOM(Out of Memory,内存溢出)。 但是,当使用元空间替代了永久代之后,出现 OOM 的几率就被大大降低了,因为元空间使用的是本地内存,这样元空间的大小就只和本地内存的大小有关了,从而大大降低了 OOM 的问题。

2.降低运维成本

因为元空间使用的是本地内存,这样就无需运维人员再去专门设置和调整元空间的大小了。

小结

之所以,使用元空间替代永久代,主要是因为官方需要将 HotSpot 虚拟机和 JRockit 融合,而 JRockit 虚拟机不存在永久代的概念,所以要去掉永久代的概念,除此之外使用元空间还可以提高稳定性、降低 OOM 以及节省运维成本。


以上内容来自我的 《Java 面试突击训练营》,这门课程是 有着 14 年工作经验(前 360 开发工程师),9 年面试官经验的我,花费 4 年时间打磨完成的一门视频面试课

整个课程从 Java 基础到微服务 Spring Cloud、从实际开发问题到场景题应有尽有,如下图所示:

全程通过视频直播 + 录播的方式,把 Java 常见的面试题系统的过一遍,遇到一个问题,把这个问题相关的内容都给大家讲明白,并且视频支持永久更新和观看。

上完训练营的课程之后,基本可以应对目前市面上绝大部分公司的面试了,想要了解详情,加我微信:GG_Stone【备注:训练营】