METASPACE的理解
JAVA 8中引入了metaspace的概念代替了原有perm区,主要的目的还是为了解决perm区大小管理的困境, java 7中perm区是分布在堆内存中,而且metaspace是分布在native memory区域中,从而解决了perm大小设置不慎导致的OOM的问题。
METASPACE的参数
- metaspaceSize
初看的时候都会以为这是metaspace的区的初始大小,其实不然,这是metaspace触发fgc的初始化阈值,当metaspace第一次扩容到达metaspace的区域的时候,会触发fgc, fgc后如果metaspace中有大量内存被回收,那么下一此触发的阈值会有所减小,如果回收的内存比较少, 那么下一次触发的阈值会适当变大。
另外一个需要关注的地方是,当使用 jstat观察m区的占比的时候,需要关注mu这个参数,如果mu这个参数还远小于metaspaceSize, 那么其实当前占比比较大,也不需要太担心。
METASPACE区域只会full gc的时候才能被回收吗?
答案是否定的,日常G1和CMS垃圾回收器触发的时候,都会对METASPACE区域进行垃圾回收,只有当METASPACE区域到达阈值的时候,才会触发full gc。