JVM加载类的时候,需要记录类的元数据,这些数据会保存在一个单独的内存区域内,在Java 7里,这个空间被称为永久代(Permgen),在Java 8里,使用元空间(Metaspace)代替了永久代。永久代和元空间保存的数据并不完全一样,永久代中还保存另一些与类的元数据无关的杂项。

如我们之前的一篇文章016:字符串对象在JVM中是如何存放的中说的,在Java 7里将字符串常量从永久代移动到了堆区域,但是永久代并没有完全改造完成。直到Java 8,永久代的改造才算完全搞定,在元空间中保存的数据比永久代中纯粹很多,就是类的元数据,这些信息只对编译期或JVM的运行时有用。

理论学习

使用Java 8以后,关于元空间的JVM参数有两个:-XX:MetaspaceSize=N-XX:MaxMetaspaceSize=N,对于64位JVM来说,元空间的默认初始大小是20.75MB,默认的元空间的最大值是无限。MaxMetaspaceSize用于设置metaspace区域的最大值,这个值可以通过mxbean中的MemoryPoolBean获取到,如果这个参数没有设置,那么就是通过mxbean拿到的最大值是-1,表示无穷大。

由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M(PS:读者可以根据自己的实际情况再调整)。

源码分析

MetaspaceSize表示metaspace首次使用不够而触发FGC的阈值,只对触发起作用,原因是:垃圾搜集器内部是根据变量_capacity_until_GC来判断metaspace区域是否达到阈值的,初始化代码如下所示:

void MetaspaceGC::initialize() {
// Set the high-water mark to MaxMetapaceSize during VM initializaton since
// we can't do a GC during initialization.
_capacity_until_GC = MaxMetaspaceSize;
}

GC收集器会在发生对metaspace的回收会,会计算新的capacityuntil_GC值,以后发生FGC就跟MetaspaceSize没有关系了。

如果不设置MetaspaceSize,则默认的capacityuntilGC为20M左右,具体代码如下:![屏幕快照 2018-10-16 下午6.46.27.png](https://img-blog.csdnimg.cn/20191004214604165.png?x-oss-process=image/watermark,typeZmFuZ3poZW5naGVpdGk,shadow10,textaHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2R1cWlfMjAwOQ==,size16,colorFFFFFF,t_70)***本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。

最新文章

  1. C#中的扩展方法
  2. 使用python拼接多张图片.二三事
  3. jQuery插件制作方法
  4. VScode常用几个前端插件live HTML previewer和debugger for chrome的配置
  5. UICollectionView + AFNetWorking 异步加载,局部刷新.
  6. opencv配置(2.49)
  7. solr 5.5.1安装并配置中文分词IKAnalyzer
  8. 用cryptico.js实现RSA加密(应对cryptico不支持PEM)
  9. poj1741_Tree(树的点分治入门题)
  10. VS2010下创建的VB.NET项目打包发布安装包的流程
  11. 移动端JS判断手势方向
  12. 关于大数据时代传统商业存储的思考: 中心存储 VS 分布式存储
  13. vue+原生JavaScript实现slideDown与slideUp[简单思路]
  14. HDU-AcmKeHaoWanLe训练实录
  15. 2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算
  16. hive并行执行作业; 强化在脑海的印象
  17. linux之/proc
  18. python之变量与常量
  19. BZOJ1845 [Cqoi2005] 三角形面积并 扫描线 计算几何
  20. Flask源码阅读-第二篇(flask\__init__.py)

热门文章

  1. [b0030] python 归纳 (十五)_多进程使用Pool
  2. Python创建virtualenv虚拟环境方法
  3. vue+hammer.js完美实现长按、左滑,右滑等触控事件
  4. emacs 帮助相关命令
  5. 让Windows的文件名区分大小写
  6. Dockerfile语法简介
  7. lua 5 流程控制 if
  8. jQuery中的工具(十)
  9. Paper | Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising
  10. 【VSFTP服务】vsftpd文件传输协议