JDK8 Metaspace元空间

  1. 内存占用 --- footprint
  2. 本地内存(native memory)--JVM分配的非堆系统内存

Metaspace是用来代替JDK7及以前版本中的permGen。

为什么移除持久代

  • 它的大小是在启动时固定好的——很难进行调优。-XX:MaxPermSize,设置成多少好呢?
  • HotSpot的内部类型也是Java对象:它可能会在Full GC中被移动,同时它对应用不透明,且是非强类型的,难以跟踪调试,还需要存储元数据的元数据信息(meta-metadata)。
  • 简化Full GC:each garbage collector in HotSpot needed specialized code for dealing with metadata in the PermGen
  • 打算在GC不进行暂停的情况下并发地释放类数据。
  • 使得原来受限于持久代的一些改进未来有可能实现

Metaspace定义/Capacity

JDK8 使用本地内存来表示类/classloader的元数据,这个区域就叫做元空间。

-XX:MaxMetaspaceSize来配置元空间

PermGen和Metaspace区别

  1. PermGen and Metaspace一个关键区别是:PermGen是Java Heap的一部分,而Metaspace不是Heap的一部分,而是仅仅受到操作系统限制的本地内存的一部分。
  2. jj

Metaspace垃圾回收

  1. 一旦类元数据内存占用达到MaxMetaspaceSize设定的大小,就会回收已经死亡的类和classloader相关的元数据。

Metaspace监控??

  1. 从HotSpot 1.8 详细的GC日志输出中可用看到元空间的使用情况。

GC log中,和Metaspace相关的字段

Metaspace used 2425K, capacity 4498K, committed 4864K, reserved 1056768K

class space    used 262K, capacity 386K, committed 512K, reserved 1048576K
名字 含义
used 表示装载类和其他元数据占用的空间
capacity 表示在当前已分配的块(chunks)中元数据的可用空间
committed 表示块的可用空间
reserved 表示为元数据预留的空间

On the “class space” line, those values are the corresponding values for the class area in Metaspace when compressed class pointers are used.

References

  1. Java 8 JVM Memory and Thread Management
  2. Java 8的元空间(metaspace)
  3. Java 8: From PermGen to Metaspace

results matching ""

    No results matching ""