1. 运行时常量池和静态变量都存储到了堆中,MetaSpace存储类的元数据,MetaSpace直接申请在本地内存中(Native memory),这样类的元数据分配只受本地内存大小的限制,OOM问题就不存在了。除此以外,还有其余不少好处:html
2. 其实,移除永久代的工做从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没彻底移除,譬如符号引用(Symbols)转移到了native heap;java
字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。jvm
3. JDK8 HotSpot JVM 将移除永久区,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)。这意味着不会再有java.lang.OutOfMemoryError: PermGen问题,也再也不须要你进行调优及监控内存空间的使用。性能
总结:spa
PermGen空间情况:这部份内存空间将所有移除。JVM的参数:PermSize 和 MaxPermSize 会被忽略并给出警告(若是在启用时设置了这两个参数)。操作系统
Metaspace 容量:默认状况下,类元数据只受可用的本地内存限制(容量取决因而32位或是64位操做系统的可用虚拟内存大小)。新参数(MaxMetaspaceSize)用于限制本地内存分配给类元数据的大小。若是没有指定.net
这个参数,元空间会在运行时根据须要动态调整。调试
另外,对于僵死的类及类加载器的垃圾回收将在元数据使用达到“MaxMetaspaceSize”参数的设定值时进行。适时地监控和调整元空间对于减少垃圾回收频率和减小延时是颇有必要的。持续的元空间垃圾回收说明,htm
可能存在类、类加载器致使的内存泄漏或是大小设置不合适。blog
4. 总结
1). 以前不论是不是须要,JVM都会吃掉那块空间……若是设置得过小,JVM会死掉;若是设置得太大,这块内存就被JVM浪费了。理论上说,如今你彻底能够不关注这个,由于JVM会在运行时自动调校为“合适的大小”;
2). 提升Full GC的性能,在Full GC期间,Metadata到Metadata pointers之间不须要扫描了,别小看这几纳秒时间;
3). 隐患就是若是程序存在内存泄露,像OOMTest那样,不停的扩展metaspace的空间,会致使机器的内存不足,因此仍是要有必要的调试和监控。
5. 深刻理解元空间(Metaspace)
1). 元空间的内存大小
元空间是方法区的在HotSpot jvm 中的实现,方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,可是为了与堆进行区分,一般又叫“非堆”。
元空间的本质和永久代相似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。,理论上取决于32位/64位系统可虚拟的内存大小。可见也不是无限制的,须要配置参数。
2). 经常使用配置参数
a. MetaspaceSize
初始化的Metaspace大小,控制元空间发生GC的阈值。GC后,动态增长或下降MetaspaceSize。在默认状况下,这个值大小根据不一样的平台在12M到20M浮动。使用Java -XX:+PrintFlagsInitial命令查看本机的初始化参数
b. MaxMetaspaceSize
限制Metaspace增加的上限,防止由于某些状况致使Metaspace无限的使用本地内存,影响到其余程序。在本机上该参数的默认值为4294967295B(大约4096MB)。
c. MinMetaspaceFreeRatio
当进行过Metaspace GC以后,会计算当前Metaspace的空闲空间比,若是空闲比小于这个参数(即实际非空闲占比过大,内存不够用),那么虚拟机将增加Metaspace的大小。默认值为40,也就是40%。
设置该参数能够控制Metaspace的增加的速度,过小的值致使Metaspace增加的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响以后类的加载。而太大的值会致使Metaspace增加的过快,浪费内存。
d. MaxMetasaceFreeRatio
当进行过Metaspace GC以后, 会计算当前Metaspace的空闲空间比,若是空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。默认值为70,也就是70%。
e. MaxMetaspaceExpansion
Metaspace增加时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。
f. MinMetaspaceExpansion
Metaspace增加时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。