JDK8 Metaspace元空间
- 内存占用 --- footprint
- 本地内存(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区别
- PermGen and Metaspace一个关键区别是:PermGen是Java Heap的一部分,而Metaspace不是Heap的一部分,而是仅仅受到操作系统限制的本地内存的一部分。
- jj
Metaspace垃圾回收
- 一旦类元数据内存占用达到MaxMetaspaceSize设定的大小,就会回收已经死亡的类和classloader相关的元数据。
Metaspace监控??
- 从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.