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,则默认的capacityuntil_GC为20M左右,具体代码如下:


本号(javaadu)专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。

调整jvm参数_JVM源码分析之MetaspaceSize和MaxMetaspaceSize的区别相关推荐

  1. java中Mark接口_JVM源码分析之Java对象头实现

    原标题:JVM源码分析之Java对象头实现 原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 "365篇原创计划"第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Ja ...

  2. 描述一下JAVA的加载过程_JVM源码分析之Java类的加载过程

    简书 占小狼 转载请注明原创出处,谢谢! 趁着年轻,多学习 背景 最近对Java细节的底层实现比较感兴趣,比如Java类文件是如何加载到虚拟机的,类对象和方法是以什么数据结构存在于虚拟机中?虚方法.实 ...

  3. java annotiace原理_JVM源码分析之javaagent原理完全解读

    概述 本文重点讲述javaagent的具体实现,因为它面向的是我们java程序员,而且agent都是用java编写的,不需要太多的c/c++编程基础,不过这篇文章里也会讲到JVMTIAgent(c实现 ...

  4. nanotime java 博客园_JVM源码分析之System.currentTimeMillis及nanoTime原理详解

    JDK7和JDK8下的System.nanoTime()输出完全不一样,而且差距还非常大,是不是两个版本里的实现不一样,之前我也没注意过这个细节,觉得非常奇怪,于是自己也在本地mac机器上马上测试了一 ...

  5. s-sgdisk源码分析 “--set-alignment=value分区对齐参数”

    文章目录 边界对齐子命令使用 源码分析 sgdisk.cc main函数入口 gptcl.cc DoOptions解析并执行具体命令函数 gpt.cc CreatePartition创建分区函数,设置 ...

  6. java直接内存为什么快_直接内存与 JVM 源码分析

    直接内存(堆外内存) 直接内存有一种叫法,堆外内存. 直接内存(堆外内存)指的是 Java 应用程序通过直接方式从操作系统中申请的内存.这个差别与之前的堆.栈.方法区,那些内存都是经过了虚拟化.所以严 ...

  7. 集合的get方法中参数从多少开始_源码分析CopyOnWriteArrayList 中的隐藏知识,你Get了吗?...

    欢迎点击 "未读代码" ,关注公众号,文章每周更新 杭州-阿里园区墙 前言 本觉 CopyOnWriteArrayList 过于简单,寻思看名字就能知道内部的实现逻辑,所以没有写这 ...

  8. Java的wait()、notify()学习三部曲之一:JVM源码分析

    原文链接:https://blog.csdn.net/boling_cavalry/article/details/77793224 综述 Java的wait().notify()学习三部曲由三篇文章 ...

  9. jvm源码分析之interrupt()

    概述 线程的thread.interrupt()方法是中断线程.中断一个线程意味着在线程完成它的任务之前,停止它当前正在执行的操作. 如果线程堵塞在object.wait.Thread.join和Th ...

最新文章

  1. HBase学习之路 (九)HBase phoenix的使用
  2. JDK1.8源码阅读系列之二:LinkedList
  3. 趣文:如果网络浏览器是妹纸
  4. html高德地图api使用教程,高德地图API如何使用?
  5. html基础-html简介-第一个网页(1)
  6. 上升沿_PLC上升沿,下降沿的理解
  7. 在linux环境下安装wiringpi库,wiringPi库的pwm配置及使用说明
  8. JDBC学习笔记(1)
  9. java一对一关系_Java初学者疑难杂症之:一对一和一对多的关系
  10. Java Swing中键盘事件的处理
  11. 现代计算机主要有哪些方面的应用,现代汉字主要应用于哪些方面;汉字的整理有哪些内容?...
  12. GAMES101-现代计算机图形学入门-闫令琪——Lecture 22 Animation Cont 学习笔记【完结】
  13. linux shell 脚本复制特定后缀文件到另外一个文件夹下
  14. python 图表制作及功能化_Python实现从excel读取数据绘制成精美图像
  15. dell720服务器支持的显卡,Dell Poweredge 服务器显卡选择
  16. 梦想学院计算机,菲梦学院电脑版
  17. 如何快速学习一门新技术
  18. GO运行时报错: cannot find package “.“ in:
  19. 《Targeted Backdoor Attacks on Deep Learning Systems Using Data Poisoning》论文总结
  20. m基于QPSK调制解调的无线图像传输matlab仿真,包括扩频解扩均衡等模块

热门文章

  1. 计算机管理文件的教学设计,《管理计算机中的文件》教学设计文件.doc
  2. android 启动一个应用,android 在一个应用中启动另一个应用
  3. linux数组大小排序,Linux如何使用awk进行数组排序
  4. jupyter新建文件_初学jupyter,运行,下载,上传导入文件
  5. 自动化中间人攻击工具subterfuge小实验
  6. 20145228 《信息安全系统设计基础》第九周学习总结 (2)
  7. Java零基础系列003——变量
  8. bus,device,driver三者关系
  9. [转载] python字符串转有符号数字_在python中将字符串转换为8位带符号整数
  10. 记录一次有意思的XSS过滤绕过