类元数据Class Metadata
Posted use-d
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类元数据Class Metadata相关的知识,希望对你有一定的参考价值。
Java classes在Java hotspot VM内部表示为类元数据。
在之前Java hotspot VM版本,类元数据在持久代中分配。
在JDK8,持久代被移除,并且类元数据在本地内存中分配。
默认情况下,本地内存都可以被用于类元数据。
可以使用MaxMetaspaceSize 选项设置在本地内存允许设置的最大类元数据。
Java hotspot VM显示的管理元数据空间。
OS请求空间,然后分成分片,类加载器分配元数据空间从分片中,当类没有被加载器加载时,它的分片交被回收以备OS重新使用。
元数据使用由mmap分配的空间,而不是由malloc分配的。
如果UseCompressedOops 与UseCompressedClassesPointers 选项同时被使用,那么两种逻辑不同的本地内存区域会处理类元数据。
当类被卸载时,类元数据将被释放。由于垃圾回收而被卸载的Java classes,垃圾回收会卸载并释放类元数据。
当类元数据达到一定水平时,会引起垃圾回收。在垃圾回收后,可以根据类元数据释放的空间量来确定是升高high-water mark还是降低high-water mark。如果升高high-water mark可能会引起垃圾回收。high-water mark最初设置为MetaspaceSize选项的值。
根据MaxMetaspaceFreeRatio 与MinMetaspaceFreeRatio两个选项决定high-water mark的提高还是降低。
如果已经分配的类元数据空间占比大于MaxMetaspaceFreeRatio的值,则high-water mark将降低。
如果已经分配的类元数据空间占比小于MinMetaspaceFreeRatio的值,high-water mark将提升。
可以为MetaspaceSize 选择指定更高的值,以避免对类元数据的过早垃圾回收。
为应用程序分配多少类元数据空间取决于应用程序,没有一个通用标准。
Heap PSYoungGen total 10752K, used 4419K [0xffffffff6ac00000, 0xffffffff6b800000, 0xffffffff6b800000) eden space 9216K, 47% used [0xffffffff6ac00000,0xffffffff6b050d68,0xffffffff6b500000) from space 1536K, 0% used [0xffffffff6b680000,0xffffffff6b680000,0xffffffff6b800000) to space 1536K, 0% used [0xffffffff6b500000,0xffffffff6b500000,0xffffffff6b680000) ParOldGen total 20480K, used 20011K [0xffffffff69800000, 0xffffffff6ac00000, 0xffffffff6ac00000) object space 20480K, 97% used [0xffffffff69800000,0xffffffff6ab8add8,0xffffffff6ac00000) Metaspace used 2425K, capacity 4498K, committed 4864K, reserved 1056768K class space used 262K, capacity 386K, committed 512K, reserved 1048576K
used为加载类使用的空间
capacity为可当前分片中可用的元数据空间
committed为可用的分片数量
reserved为元数据保留的空间数量
以上是关于类元数据Class Metadata的主要内容,如果未能解决你的问题,请参考以下文章