jdk8内存模型变更-永久代更换为元空间

参考文章
jdk8之后的HotSpot JVM将永久代取出, 取而代之的是Meta Space(元空间)

为什么被移出HotSpot JVM?

1.由于 PermGen 内存经常会溢出,引发恼人的 java.lang.OutOfMemoryError: PermGen,因此 JVM 的开发者希望这一块内存可以更灵活地被管理,不要再经常出现这样的 OOM
2.移除 PermGen 可以促进 HotSpot JVM 与 JRockit VM 的融合,因为 JRockit 没有永久代。

PermGen何去何从?
  • 方法区移至 Metaspace
  • 字符串常量移至 Java Heap
  • JDK 8 开始把类的元数据放到本地堆内存(native heap)中,这一块区域就叫 Metaspace,中文名叫元空间
使用本地内存的优点

OOM问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制.
不过应该适当限制 Metaspace 的大小: 使用 -XX:MaxMetaspaceSize 参数来指定 Metaspace 区域的大小. JVM 默认在运行时根据需要动态地设置 MaxMetaspaceSize 的大小.
除此之外,它还有以下优点

  • Take advantage of Java Language Specification property : Classes and associated metadata lifetimes match class loader’s
  • Linear allocation only
  • No individual reclamation (except for RedefineClasses and class loading failure)
  • No GC scan or compaction
  • No relocation for metaspace objects
GC行为

如果Metaspace的空间占用达到了设定的最大值,那么就会触发GC来收集死亡对象和类的加载器。根据JDK 8的特性,G1和CMS都会很好地收集Metaspace区(一般都伴随着Full GC).
为了减少垃圾回收的频率及时间,控制吞吐量,对Metaspace进行适当的监控和调优是非常有必要的。如果在Metaspace区发生了频繁的Full GC,那么可能表示存在内存泄露或Metaspace区的空间太小了。

What's New?
  • 新增加了几个jvm参数
  • 监测工具可以监测到Meta Space的实时状态

你可能感兴趣的:(jdk8内存模型变更-永久代更换为元空间)