美文网首页
jdk8内存模型变更-永久代更换为元空间

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

作者: OisCircle | 来源:发表于2018-10-10 23:29 被阅读0次

    参考文章
    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内存模型变更-永久代更换为元空间

          本文链接:https://www.haomeiwen.com/subject/qffvaftx.html