Java相关

JVM - Metaspace

2020-04-02  本文已影响0人  万福来

JVM - Metaspace

JDK8 HotSpot JVM现在使用了本地内存来存储类元数据,被称为Metaspace,和Oracle JRockit以及IBM JVM类似。
它意味着java.lang.OutOfMemoryError:PermGen space问题会越来越少,也不再需要你去调整和监控内存空间。然而这种变化默认是可不见的,接下来我们给你展示的,是你仍然需要关注类元数据内存占用。请记住,这些新特点并不会很神奇的消除类和类加载器的内存泄露。你需要使用不同的方法和学习新的命名约定来找出问题的根源。

总结:

  1. 持久代场景
    • 这块内存区域被完全移除。
    • PermSize和MaxPermSize JVM 参数会被忽略,并且在启动的时候会给出警告信息。
  2. Metaspace 内存分配模型
    • 对于类元数据的大多数内存分配都不会发生在本地内存。
    • 被用于描述类元数据的类对象被移除。
  3. Metaspace 容量
    • 默认的,类元数据分配限制于可用的本地内存 (容量大小依赖于你用32位jvm或者64位jvm的操作系统可用虚拟内存)。
    • 新的标记已经可以使用 (MaxMetaspaceSize),它允许你限制用于类元数据的本地内存大小。如果你没有指定这个标记,Metaspace会根据运行时应用程序的需求来动态的控制大小。
  4. Metaspace 垃圾收集
    • 一旦类元数据的使用量达到了“MaxMetaspaceSize”指定的值,对于无用的类和类加载器,垃圾收集此时会触发。
    • 为了控制这种垃圾收集的频率和延迟,合适的监控和调整Metaspace非常有必要。过于频繁的Metaspace垃圾收集是类和类加载器发生内存泄露的征兆,同时也说明你的应用程序内存大小不合适,需要调整。
  5. Java 堆空间影响
    •一些杂项数据被移到了Java堆空间。这意味着当你更新到JDK8后会观察到Java堆空间的增长。
  6. Metaspace 监控
    • Metaspace 的使用可以通过HotSpot 1.8的详细的GC日志输出观察到。
    • 在基于b75上测试的时候Jstat 和 JVisualVM 还没有更新,旧的持久代空间引用依然存在。
上一篇 下一篇

猜你喜欢

热点阅读