深入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。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab中函数或变量 ‘eeglab‘ 无法识别

EEGLAB 没有安装或添加到 MATLAB 路径中: 确保已经安装了 EEGLAB,并且将其添加到 MATLAB 的路径中。您可以通过在 MATLAB 命令窗口中运行 which eeglab 来检查是否能够找到 EEGLAB。 EEGLAB 函数路径设置错误: 如果已经安装了 EEGLAB&#x…

可以免费试用得微信辅助工具wetool升级版,可以群发,可以清理僵尸粉,可以自动回复,可以批量添加

今天给大家推荐一款我们目前在使用的电脑群发工具掘金小蜜,不仅可以无限多开,方便你同时管理多个账号,群发功能更是十分强大,轻松释放你的双手。 掘金小蜜(只支持Win7及以上操作系统,没有推Mac版和手机客户…

【知识拓展】LocalTunnel-高性价比的内网穿透工具(2)

前言 上一篇通过ngrok进行内网穿透,有几个问题: ①需要注册,而且注册需要科学上网,相对麻烦 ②安装配置相对麻烦,authtoekn有限制 上述相对,指的是在非生产环境中做一个简单内网穿透,相对于…

neo4j开放远程连接

注:本博客所用neo4j版本为社区5.12版 第一步:修改neo4j配置文件 首先找到neo4j的安装位置,点击进入conf文件夹,随后点击neo4j.conf文件,在“Network connector configuration”下面的单元中找到server.default_liste…

汽车IVI中控开发入门及进阶(二十):显示技术之LCDC

TFT LCD=Thin Film Transistor Liquid Crystal Display LCDC=LCD Controller 薄膜晶体管液晶显示器(TFT LCD)控制器在驱动现代显示技术的功能和性能方面起着关键作用。它们充当屏幕后面的大脑,仔细处理数字信号,并将其转化为精确的命令,决定每个像素的行为,决定它们的…

计算机网络基本概念

文章目录 情景带入一些基本概念网络网络编程:7层网络模型OSI:TCP/IP Protocol Architecture Layers与OSI的对应关系SocketClient-Server Application报文段:传输协议:Mac地址IP地址端口URL 情景带入 随着时代的发展,我…

STM32—HAL-PWM-舵机180(每个频率对应每个角度)

1开启时钟 2开启定时器和通道设置为PWM模式 3将定时时间设置为50Hz(20ms)//每25为1ms 4代码编写 4.1开启PWM 4.2改PWM的占空比 4.3效果0~180度在0度 源码 /* USER CODE BEGIN Header */ /******************************************************************************…

《C++ Primer Plus》第十一章复习题和编程练习

这里写目录标题 一、复习题二、编程练习 一、复习题 1. 使用成员函数为Stonewt类重载乘法运算符,该运算符将数据成员与double类型的值相乘。注意,当用英石和磅表示时,需要进位。也就是说,将10英石8磅乘以2等于21英石2磅。 答&am…

Imperva 导致的ORAbase 乱码

DBCA Failing Because Of Garbage Characters In ORACLE_BASE Variable (Doc ID 2947963.1)​编辑To Bottom In this Document Symptoms Changes Cause Solution APPLIES TO: Oracle Database Configuration Assistant - Version 19.14.0.0.0 and later Oracle Database - E…

本地镜像文件怎么导入docker desktop

docker tag d1134b7b2d5a new_repo:new_tag

PageHelper分页

文章目录 PageHelper分页ThreadLocalMap和ThreadLocal执行完PageHelper.startPage之后,分页参数存储到哪里了?Page和List的关系?PageInterceptor分页拦截器的作用?PageInfo的作用与结构?最后看下引入的pagehelper分页依…

YoloV1模型

You Only Look Once 文章目录 You Only Look Once置信度定义类别条件概率NMSnp.maxmiumnp.argsort() Yolov1直接采用网络特征输出,实现置信度预测、分类、边界框回归; 核心内容总结: 输入图像划分为 S S 网格。如果对象的中心落入网格单元中…

linux 安装chrome浏览器

一、下载安装包 下载地址:https://download.csdn.net/download/k0307x1990y/89349171 二、安装流程 [rootlocalhost ~]# rpm -ivh *.rpm [rootlocalhost ~]# yum -y localinstall google-chrome-stable_current_x86_64.rpm [rootlocalhost ~]# 三、修改配置文件…

Vxe UI 表单设计器、零代码平台

vxe-pc-ui Vxe UI 表单设计器、零代码表单设计器 安装 Vxe UI PC端组件库 官方文档 查看 github、gitee // ...import VxeUI from vxe-pc-uiimport vxe-pc-ui/lib/style.css// ...// ...createApp(App).use(VxeUI).mount(#app)// ...使用 vxe-form-design 设计器组件 vxe-fo…

【安装笔记-20240523-Windows-安装测试 ShareX】

安装笔记-系列文章目录 安装笔记-20240523-Windows-安装测试 ShareX 文章目录 安装笔记-系列文章目录安装笔记-20240523-Windows-安装测试 ShareX 前言一、软件介绍名称:ShareX主页官方介绍 二、安装步骤测试版本:16.1.0下载链接功能界面 三、应用场景屏…

QML的Image 路径问题(source)

四种路径格式 在 QML 中,当你使用 Image 元素的 source 属性来指定一个图片的路径时,有几种不同的方式可以指定这个路径,每种方式都有其特定的用途和上下文。 相对路径: QML 文件和一个名为 close.png 的图片在同一目录下&#x…

Spring:面向切面(AOP)

1. 代理模式 二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类**间接**调用。让不属于目标方法核心逻辑的代码从目标方法中剥…

【热门话题】Debian常用命令指南

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Debian常用命令指南引言1. 文件与目录操作lscdmkdirrmcpmv 2. 包管理aptdpkg 3.…