java8 中metaspace的理解

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。

上一篇:[算法]排列


下一篇:算法设计与分析之全排列问题