持久代
PermanentGenerationspace(JDK1.7及以下版本存在)
主要存放存放class文件中类的版本、字段、方法、接口,类和方法的元数据等描述信息,运行时常量池,用于存放编译器生成的各种字面量和符号引用。上限是MaxPermSizePremGen与old区绑定在一起,在fullGC时会一起被GCMetaSpace(JDK1.8及以上版本)
PermGen中方法区移至Metaspace,字符串常量移至JavaHeap。类的元数据信息(metadata)还在,只不过不再是存储在连续的堆空间上,而是移动到叫做“Metaspace”的本地内存(Nativememory)中。
**MetaSpace组成
**
KlassMetaspace:用来存klass的(class文件在jvm里的运行时数据结构),这块内存是紧接着Heap的。NoKlassMetaspace:专门来存klass相关的其他的内容,比如method,constantPool等,这块内存是由多块内存组合起来的,所以可以认为是不连续的内存块组成的。这块内存是必须的,虽然叫做NoKlassMetaspace,但是也其实可以存klass的内容,上面已经提到了对应场景。如果KlassMetaspace用完了,那就会OOM了,不过一般情况下不会,NoKlassMestaspace是由一块块内存慢慢组合起来的,在没有达到限制条件的情况下,会不断加长这条链,让它可以持续工作。MetaSpace主要参数
-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整。-XX:MaxMetaspaceSize,最大空间,默认是没有限制的(自增)。建议设置,如果出现内存增长不释放,会占用所有的内存空间直至被OSkill掉。-XX:CompressedClassSpaceSize,默认1G,这个参数主要是设置KlassMetaspace的大小,不过这个参数设置了也不一定起作用,前提是能开启压缩指针,假如Xmx超过了32G,压缩指针是开启不来的。如果有KlassMetaspace,那这块内存是和Heap连着的。-XX:InitialBootClassLoaderMetaspaceSize,64位下默认4M,32位下默认K,NoKlassMetaspace是由一块块内存组合起来的,这个参数决定了NoKlassMetaspace的第一个内存Block的大小,即2*InitialBootClassLoaderMetaspaceSize,同时为bootstrapClassLoader的第一块内存chunk分配了InitialBootClassLoaderMetaspaceSize的大小。-XX:MinMetaspaceExpansion和XX:MaxMetaspaceExpansion,默认分别是.8K和5.2M,这两个值为了增大触发metaspaceGC的阈值。gcLocker或者should_concurrent_collect的一些场景,因为这些场景下接下来会做一次GC,相信在接下来的GC中可能会释放一些metaspace的内存,于是先临时扩大下metaspace触发GC的阈值,而有些内存分配失败其实正好是因为这个阈值触顶导致的,于是可以通过增大阈值暂时绕过去。-XX:MinMetaspaceFreeRatio和XX:MaxMetaspaceFreeRatio,默认分别是默认40和70,主要是影响触发metaspaceGC的阈值。每次GC完之后,假设我们允许接下来metaspace可以继续被