深入JVM元空间以及弹性伸缩机制

个人博客

深入JVM元空间以及弹性伸缩机制 | iwts’s blog

JVM内存模型中元空间所在位置

即在JVM运行时的内存模型。总体上有这样的图:

元空间

上面的图其实有点不太准。方法区本质上只是JVM的一个标准,不同JVM在不同版本下都可能有不同的实现,例如JDK1.7之前的永久代之类的。

这里主要聊JDK1.8下HotSpot的实现:元空间。

元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过参数来指定元空间的大小:

  1. -XX:MetaspaceSize,初始空间大小,达到该值就会触发GC进行类型卸载,同时JVM会对该值进行调整。

    a> 如果释放了大量的空间,就适当降低该值。

    b> 如果释放了很少的空间,那么在不超过MaxMetaspaceSize的前提下,适当提高该值。

  2. -XX:MaxMetaspaceSize,最大空间大小,默认是没有限制的。

元空间也有溢出,超过了最大空间则会OOM,但是会明显提示:

Metaspace OutOfMemoryError

但是相比而言,因为用的本地内存,所以总归还是大很多的,只要最大空间设的足够大,OOM几率要比1.7之前的永久代低很多。

元空间是放在堆外内存,所有JVM线程间共享,它存储每一个类的结构。其中包括:

  1. 运行时常量池。
  2. 字段和方法数据。
  3. 方法和构造函数的代码。
  4. 还有特殊的方法用于类和实例的初始化,以及接口的初始化。
  5. JIT代码缓存。

元空间两大组成

Metaspace由两大部分组成:

  1. Klass Metaspace。
  2. NoKlass Metaspace。

klass其实就是class的意思,区分一下概念。

Klass Metaspace

Klass本质上是class文件在JVM里的运行时数据结构,但是Class的实例对象是存在堆里的,两者没有关系。

而Klass存储在压缩类空间中。

压缩类空间 Compressed Class Pointer Space

压缩类空间(Compressed Class Pointer Space),是一块连续的内存区域,紧接着堆。通过-XX:CompressedClassSpaceSize来控制这块内存的大小,默认是1G。

NoKlass Metaspace

就是相反,只要不是压缩类空间,但是在元空间中的,就都是NoKlass Metaspace。

专门来存class相关的其他的内容,比如方法数据,运行时常量池等,可以由多块不连续的内存组成。

但是也可以存class,如果压缩类空间不存在,那么class就存在这里。

运行时常量池

类或接口的字节码文件里的常量池的运行时表示形式,它包含几种常量。例如:

  1. 编译时就已经知道的数字字面量值。
  2. 必须在运行时解析的方法和字段的引用。

运行时常量池的功能类似于传统语言的符号表,不过它包含的数据会更加宽泛。

运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class类都有一个运行时常量池,而被该类全部的实例对象共用。类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。

例如static变量、方法,都是在运行时常量池中。

运行时常量池分配在JVM的NoKlass Metaspace,类或接口的运行时常量池在类或接口被JVM创建时才会构建。

元空间内存管理

在元空间中,类和其元数据的生命周期与其对应的类加载器相同,只要类的类加载器是存活的,在Metaspace中的类元数据也是存活的,不能被回收。

每个加载器有单独的存储空间,通过 ClassLoaderMetaspace来进行管理 SpaceManager* 的指针,相互隔离的。

所以GC本身是不处理元空间的,因为只要类加载器没有问题,里面的数据必然在其生命周期内,就算GC也不能认为是垃圾。

但是可以执行卸载,直接卸载类加载器。如果某个类加载器不再存活,那么会卸载整个类加载器下的元空间数据。

Metaspace VM利用块分配器(Chunking Allocator)来管理元空间的内存分配。块的大小依赖于类加载器的类型。

Metaspace VM中有一个全局的可使用的块列表(A Global Free List of Chunks)。当类加载器需要一个块的时候,类加载器从全局块列表中取出一个块,添加到它自己维护的块列表中。当类加载器死亡,它的块将会被释放,归还给全局的块列表。

元空间弹性伸缩

由于元空间和堆并不在一起,所以这块的空间可以不用设置或者单独设置。但是一般情况下,为了避免元空间耗尽 JVM 的内存,所以都会设置 MaxMetaSpaceSize,即最大元空间大小。

在运行过程中,如果实际大小小于这个值,JVM 就会通过 -XX:MinMetaspaceFreeRatio-XX:MaxMetaspaceFreeRatio两个参数动态控制整个 MetaSpace 的大小。

这个动态控制的过程就是弹性伸缩。

但是弹性伸缩执行的时候性能很差,为了避免弹性伸缩带来的额外 GC 消耗,一般情况下是保证元空间大小不变,也就是将-XX:MetaSpaceSize-XX:MaxMetaSpaceSize两个值设置为固定。

但是这样也会导致在空间不够的时候无法扩容,然后频繁地触发 GC,最终 OOM。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/646320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

民国漫画杂志《时代漫画》第25期.PDF

时代漫画25.PDF: https://url03.ctfile.com/f/1779803-1248635084-fd4794?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

2024年上半年软件系统架构师考试【回忆版】

文章目录 考试时间考试地点综合知识案例分析1、微服务架构的优点和缺点2、质量属性的6个要素3、分布式锁 Redis的缺点4、MongoDB 存储矢量图的优势 论文回忆版论文一、论单元测试的设计与应用论文二、论大数据模型的设计与应用论文三、论模型驱动的架构设计及应用论文四、论云原…

浅谈Docker容器的网络通信原理

文章目录 1、回顾容器概念2、容器网络3、容器与主机之间的网络连通4、交换机的虚拟实现---虚拟网桥(Bridge)5、Docker 守护进程daemon管理容器网络 1、回顾容器概念 我们知道容器允许我们在同一台宿主机(电脑)上运行多个服务&…

kali基本扫描工具(自带)

免责声明:本文仅做技术交流与学习...请勿非法破坏... 详细用法: 命令 -h/百度/翻译 fping 用法 hostlist 文件里面为ip fping -a -q -f hostlist -a 只看存活的 fping -g 202.100.1.1 202.100.1.255 -a -q > Ahost 输出到Ahost文件上 nping nping -c 1 201.100.2.155-244 …

ES 查询踩坑-全字段匹配

需求:name字段需要全匹配查询 name的映射 普通的must查询 GET power_engin/_search {"from": 0,"size": 10,"query": {"bool": {"must": [{"term": {"name": {"value": "尼…

数据结构--《二叉树》

二叉树 1、什么是二叉树 二叉树(Binar Tree)是n(n>0)个结点的优先集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树构成。 这里给张图,能更直观的感受二叉树&#xff1…

异步那些事01

首先我们肯定先说创建线程 1.继承Thread类 o定义一个类MyThread继承Thread类 o在MyThread类中重写run()方法 o创建MyThread类的对象 o启动线程 package Java.thread;public class first extends Thread{public void run(){for(int i0;i<50;i){System.out.println("我…

【MySQL】——并发控制

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

Vapor Mode:Vue.js 的速度与激情,代码界的闪电侠

大家好&#xff0c;我是宝哥。 在快速发展的网络开发世界中&#xff0c;创新的Vue.js团队给我们带来了Vapor Mode。这个新模式优化了Vue的核心渲染过程&#xff0c;帮助我们的应用程序像轻烟一样运行&#xff0c;开发者无需深入复杂的优化工作。 在这篇文章中&#xff0c;我们将…

贝叶斯算法:机器学习中的“黄金法则”与性能提升之道

&#x1f440;传送门&#x1f440; &#x1f50d;机器学习概述&#x1f340;贝叶斯算法原理&#x1f680;贝叶斯算法的应用✨文本分类✨医疗系统 &#x1f496;贝叶斯算法优化✨贝叶斯算法优化的主要步骤✨贝叶斯算法优化的优点✨贝叶斯算法优化的局限性 &#x1f697;贝叶斯算…

详细分析tcping的基本知识以及用法

目录 前言1. 安装配置2. 基本知识3. Demo 前言 针对ping的基本知识推荐阅读&#xff1a;详细分析ping的基本知识以及常见网络故障的诊断&#xff08;图文解析&#xff09; 1. 安装配置 针对Window的下载如下&#xff1a; 安装路径&#xff1a;tcping官网 下载tcping.exe&a…

【开源】大学生竞赛管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、系统介绍 学生管理模块 教师管理模块 竞赛信息模块 竞赛报名模块 二、系统截图 三、核心代码 一、系统介绍 基于Vue.js和SpringBoot的大学生竞赛管理系统&#xff0c;分为管理后台和用户网页端&#xff0c;可以给管理员、学生和教师角色使用&#xff0c;包括学…

STM32手写超频到128M函数

今天学习了野火的STM32教程学会了如何设置STM32的时钟频率&#xff0c;步骤比较详细&#xff0c;也很容易理解&#xff0c;就是视频教程不能跳着看&#xff0c;只能一节节的看&#xff0c;不然会知识不连贯&#xff0c;造成有些知识不理解&#xff0c;连续着看还是没有什么难度…

闲置商标转让出现这些状态时注意!

近日以前做转让的一个朋友的商标转让证明下来&#xff0c;正好是2个半月&#xff0c;普推知产老杨发现这个时间也太快&#xff0c;以前差不多四个月左右&#xff0c;有些朋友需要购买闲置商标&#xff0c;3个月内所有权就变成自己的。 在购买闲置商标时要注意有一些细节&#x…

创新实训2024.05.26日志:服务端接口实现——用户开启多个会话

1. 概念图 类似于Kimi&#xff0c;文心一言&#xff0c;chatGPT等市面上主流的大模型&#xff0c;我们的大模型也支持同一个用户的多个会话&#xff0c;并且提供支持联系上下文给出解答的能力。 2. 基于会话的对话 在langchain chatchat这个对langchain框架进行二次封装的第三…

GPT-4 与 GPT-4 Turbo有什么区别?

在不断发展的人工智能和自然语言处理领域&#xff0c;OpenAI 的 GPT 系列一直走在最前沿&#xff0c;彻底改变了机器理解和生成类人文本的方式。每一次迭代&#xff0c;进步都会突破可能性的界限。 最新的条目 GPT-4 和 GPT-4 Turbo 引起了人工智能社区内外的极大兴趣和争论。…

推荐13款常用的Vscode插件,提高前端日常开发效率

1. Live Server Live Server 插件是一个用于前端开发的扩展&#xff0c;它的主要作用是提供一个本地开发服务器&#xff0c;以便实时预览和调试网页应用程序。其最大特点在于热重载&#xff0c;即开发者可实时预览代码效果。 因为Live Server 允许开发者在浏览器中实时预览您正…

【C++】详解深浅拷贝的概念及其区别

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 什么是拷贝 什么是浅拷贝 什么是深拷贝 深浅拷贝的区别及使用场景 结语 什么是拷贝 在C编程中&#xff0c;拷贝是一个非常重要的概念&#xff0c;对于理解和使用类和对象起…

浅谈JMeter体系结构

JMeter体系结构详解 JMeter是一款功能强大的开源性能测试工具&#xff0c;广泛应用于Web应用、数据库、FTP服务器等多种场景下的负载和压力测试。其灵活的体系结构设计使得测试计划的创建、执行与结果分析变得高效而直观。本文将深入解析JMeter的三维空间体系结构&#xff0c;…

C++实现定长内存池

项目介绍 本项目实现的是一个高并发的内存池&#xff0c;它的原型是Google的一个开源项目tcmalloc&#xff0c;tcmalloc全称Thread-Caching Malloc&#xff0c;即线程缓存的malloc&#xff0c;实现了高效的多线程内存管理&#xff0c;用于替换系统的内存分配相关函数malloc和fr…