JDK 8内存布局和垃圾回收

据我所知 ,从JDK 8开始,PermGen将成为java历史上的一个页面。 一切都很美好…但新的内存布局会是什么样子? 这会影响新平台上的GC吗?

PermGen被 Oracle / Sun JDK8中的Metaspace取代,它非常相似。 主要区别在于Metaspace可以在运行时扩展。

这是permGen存在的时候 在此处输入图像描述

在Metaspace推出之后 在此处输入图像描述

当然,Java 8中的GC有很多改进。您可以查看此stackoverflowpost

在Metaspace中,为元数据分配多个映射的虚拟内存空间,并且根据类加载器的类型及其活动性,按类加载器分配(以块为单位)。 块返回到空闲块列表,并在清空时返回虚拟内存空间。

GC的优点是

  • 在完全收集期间,不扫描元数据到元数据指针
  • 删除了许多用于元数据扫描的复杂代码(特别是用于CMS)。
  • Metaspace包含很少的Java堆指针。
  • 没有元数据的压缩成本
  • 减少根扫描(不扫描已加载类和其他内部哈希表的VM字典)。

更多细节在这里