专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

一文读懂 - 元空间和永久代

124_1.png为什么JDK8中永久代 离家出走,元空间 鸠占鹊巢,为什么永久代要离开,永久代和元空间到底是何方神圣?

124_2.png

欢迎走进今天的《走近科学》,呸,走进今天的《一文读懂 – 元空间和永久代》

124_3.png


124_4.png

Java7及以前版本的细化JVM结构图

124_5.png

从图中可以看出,在7以及之前堆和方法区连在了一起,但这并不能说堆和方法区是一起的,它们在逻辑上依旧是分开的。但在物理上来说,它们又是连续的一块内存,下面的图可能可以帮助我们更好的理解。

124_6.png

124_7.png

首先我们来认识一下永久代的概念

“永久代(Permanet Generation,也称PermGen)”。对于习惯了在HotSpot虚拟机上开发、部署的程序员来说,很多人都愿意将方法区称作永久代。

本质上来讲两者并不等价,仅因为Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在他虚拟机上是没有永久代的概念的,永久代是Hotspot针对该规范进行的实现。

什么是HotSpot:我们通常使用的Java SE都是由Sun JDK和OpenJDK所提供,这也是应用最广泛的版本。 而该版本使用的VM就是HotSpot VM。简单来说,我们所讲的java虚拟机指的就是HotSpot的版本。

再重复一遍就是,Java7及以前版本的Hotspot中方法区位于永久代中。同时,永久代和堆是相互隔离的,但它们使用的物理内存是连续的。

小Tip:永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。

然后,在Java8中,时代变了,Hotspot取消了永久代。

永久代真的成了永久的记忆。永久代的参数-XX:PermSize和-XX:MaxPermSize也随之失效。

124_8.png

124_9.png

对于Java8,HotSpots取消了永久代,那么是不是就没有方法区了呢?

当然不是,方法区只是一个规范,只不过它的实现变了。

在Java8中,元空间(Metaspace)鸠占鹊巢,方法区存在于元空间(Metaspace)。

同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。

124_10.png

针对Java8的调整,我们再次对内存结构图进行调整。

124_11.png

元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中的 “java.lang.OutOfMemoryError: PermGenspace”

默认情况下元空间是可以无限使用本地内存的,但为了不让它如此膨胀,JVM同样提供了参数来限制它使用的使用。

  • -XX:MetaspaceSize,class metadata的初始空间配额,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。
  • -XX:MaxMetaspaceSize,可以为class metadata分配的最大空间。默认是没有限制的。
  • -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集。
  • -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集。

124_12.png

表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。

当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

更深层的原因还是要合并HotSpot和JRockit的代码,使用了元空间取代永久代,不用担心运行性能问题了,在覆盖到的测试中, 取代后程序启动和运行速度降低不超过1%,但是这点性能损失换来了更大的安全保障。


文章参考:

1,Monica Beckwith 《永久代去哪了了?》

2,程序新视界,丑胖侠二师兄

3,深入理解Java虚拟机(第2版)


如果文章对你有帮助,记得文末点赞哦!

124_13.png

文章永久链接:https://tech.souyunku.com/29284

未经允许不得转载:搜云库技术团队 » 一文读懂 - 元空间和永久代

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们