JVM--方法区元空间

news2024/11/28 7:49:30

前言

本篇对java的JVM线程共享内存中的方法区进行系统性的讲解。

 

1、方法区&元空间概念

方法区是《Java虚拟机规范》中规定的一个内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。

元空间是方法区的实现。方法区的实现,JDK1.7之前是永久代,JDK1.8之后是元空间。

 

2、与永久代的区别

永久代和元空间的不不同点:

1、永久代在物理上是堆的一部分,元空间内存是操作系统本地内存。

2、jdk7中将StringTable放到了堆空间中。因为永久代的回收效率很低,在full gc的时候才会触发。而full gc是老年代的空间不足、永久代不足时才会触发。这就导致StringTable回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存。

3、元空间的回收

元空间大小会在JAVA程序运行过程中不断在GC后进行调整:

(相关参数可以查看文章后面内容)

 

4、类压缩空间CompressedClassSpace

4.1、什么是类压缩空间

在 64 位平台上,HotSpot 使用了两个压缩优化技术,Compressed Object Pointers (“CompressedOops”) 和 Compressed Class Pointers。

压缩指针,指的是在 64 位的机器上,使用 32 位的指针来访问数据(堆中的对象或 Metaspace 中的元数据)的一种方式。


 

4.2、为什么会有类压缩空间

32 位的指针占用更小的内存,可以更好地使用缓存

4.3、类压缩空间开启及参数

涉及参数如下:

-XX:+UseCompressedOops 允许对象指针压缩。默认开启。

-XX:+UseCompressedClassPointers 允许类指针压缩。默认开启。

-XX:CompressedClassSpaceSize 类压缩空间大小,默认1G,不能大于3G。

类压缩空间开启要求

1、类指针压缩开启必须需要对象指针压缩的开启,反过来则不需要

2、对象指针压缩开启要求堆大小 小于 32G,所以类压缩空间开启需要堆大小小于32G

4.4、类压缩原理介绍

注:

A、压缩的是引用klass的指针,不是klass。

B、如果类压缩空间没有开启,那么klass数据就存放在non-klass空间。

klass和non-klass空间

一个类被加载内存分配如下: 

 

 

5、参数介绍及优化建议

注:可以用 java -XX:+PrintFlagsFinal -version |grep 【参数】 开查看参数的默认值

a、MetaspaceSize

初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。

个人建议可以和MaxMetaspaceSize设置成一样大。

b、MaxMetaspaceSize

最大元空间大小,默认是没有限制,最大限制就是操作系统本地内存的限制

建议:

1、最好限制元空间的最大大小,避免导致操作系统内存使用率过高,避免代码问题过晚暴露(如有类加载器出现泄露)。

2、如果启动之后,发现应用元空间GC过于频繁,应该调大一点。

c、MinMetaspaceFreeRatio

最小空闲比,当 Metaspace 发生 GC 后,会计算 Metaspace 的空闲比,如果空闲比(空闲空间/当前 Metaspace 大小)小于此值,就会触发 Metaspace 扩容。默认值是 40。

d、MaxMetaspaceFreeRatio

最大空闲比,当 Metaspace 发生 GC 后,会计算 Metaspace 的空闲比,如果空闲比(空闲空间/当前 Metaspace 大小)大于此值,就会触发 Metaspace 释放空间。默认值是 70 。

e、MinMetaspaceExpansion和MaxMetaspaceExpansion

这两个并不是直接限定元空间扩容的大小,而是为了增大触发 metaspace GC 的阈值。

MinMetaspaceExpansion默认332.8K,增大触发metaspace GC阈值的最小要求。

如果需要分配的内存小于MinMetaspaceExpansion,则将metaspace GC的阈值提升MinMetaspaceExpansion。

MaxMetaspaceExpansion默认5.2M,增大触发metaspace GC阈值的最大要求。

如果需要分配的内存大于MinMetaspaceExpansion但是小于MaxMetaspaceExpansion,那增量就是MaxMetaspaceExpansion。

如果需要分配的内存超过了MaxMetaspaceExpansion,那增量就是MinMetaspaceExpansion加上要分配的内存大小

注:每次分配只会给对应的线程一次扩展触发metaspace GC阈值的机会,如果扩展了,但是还不能分配,那就只能等着做GC了。

f、CompressedClassSpaceSize

类压缩空间大小,也就是klass space的大小,默认是1G,最好不要超过3G。

6、常见报错

6.1、java.lang.OutOfMemoryError: Metaspace

当出现这个错误的时候,很明显是加载的类过多,将元空间的内存占用完了。

第一步应该是先查看自己的-XX:MaxMetaspaceSize设置的是否合适,可以适当的增加,然后观察应用是否还会出现。这个是治标不治本,但是是见效最快的。

但是如果发现问题依然存在,而-XX:MaxMetaspaceSize的值已经不可以设置再大的时候,需要进行更深一步的排查。主要是如下两个方向进行排查:

A、引用的jar包加载了很多的class

排查应用引入的较大的jar包,去除掉多余的加载项,按照最小颗粒度加载。

B、动态生成类过多

Java的一些框架会使用动态代理技术等动态生成类(例如spring),使用这样方式创建对象可能会创建大量的类,导致元空间被占满。

6.2、java.lang.OutOfMemoryError: Compressed class space

元空间本身可以不设置MaxMetaspaceSize,从而让元空间大小没有限制,只受到本地内存大小限制。

但是了类压缩空间是有限制的,就算不设置CompressedClassSpaceSize,一样会有1G的限制大小。

分析方向和java.lang.OutOfMemoryError: Metaspace一样。

7、元空间分析方法

这里只讲对应工具或者命令分析该知识点的方法,具体命令和工具会在后续文章单独讲解

7.1、jinfo命令

查看参数配置

jinfo -flag MetaspaceSize 【PID】

7.2、jstat 命令

查看元空间使用百分比

jstat -gcutil 344537 | column -t

 查看元空间当前总大小及使用大小

jstat -gc 【PID】| column -t

MC是当前元空间大小

MU是当前元空间使用大小

CCSC是压缩类空间大小

CCSU是压缩类空间使用大小

 元空间统计

jstat -gcmetacapacity 【PID】| column -t

MCMN:最小元数据容量

MCMX:最大元数据容量

MC:当前元数据空间大小

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

7.3、arthas工具

查看各个类加载器加载情况

classloader

numberOfInstances:classloader的实例数量

loadedCountTotal:该实例加载类的数量

 按类加载实例查看统计信息,可以看到类加载的hashcode

classloader -l

 查看类加载的继承关系

classloader -t

 查看类加载器实际所在位置 

 

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

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

相关文章

python基础----09-----类、对象、魔法方法、封装、继承、类型注解、多态、数据分析案例

一 初识对象 说白了就是类的实例化,类是一个抽象层的定义。 例如下面class Student就是定义的一个类,它是抽象层,然后stu_1 Student(),我们根据类创建了一个对象,就是对类的实例化,这个实例化对象我们是可…

paas云底座-数字化转型,你真的了解么

云底座是什么? 如图 底座其实就是一个基础打个比方: 把底座看成一块土地,我们在这块土地上可以盖楼房,可以挖一个游泳池,可以开一家饭店 也就是说我们这块土地可以开发很多东西言归正传 云底座其实就是数字化转型的“底…

【快速幂】-迭代法:详解

何为快速幂? 我们经常会计算:。STL中有自带的pow函数,如果当n很大的时候,那么一定会TLE。 因此,我们需要另一种求值的方法:快速幂! 快速幂有两种做法:1:递归 2…

谷歌云 | 宣布跨云互连:无缝连接到您的所有云

【本文由Cloud Ace整理发布,Cloud Ace 是谷歌云全球战略合作伙伴,拥有 300 多名工程师,也是谷歌最高级别合作伙伴,多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷…

1 软件测试基本概念

文章目录 课程目标1. 入门前的7个基础问题2. 软件测试基本概念2.1 需求的概念2.1.1需求的基本概念2.1.2 从软件测试人员角度看需求2.1.3 为什么需求对软件测试人员如此重要?2.1.4 如何才可以深入理解被测试软件的需求 2.2 bug的概念(了解)2.3测试用例的概念2.3.1 概…

AI读心术

近期,德克萨斯大学奥斯汀分校的神经科学家们展开了一场「AI」实验,利用人工智能聊天机器人ChatGPT,将大脑活动转化为文字信息。 参与实验的志愿者,在进行长达20小时的「训练」后,成功被「AI」识别出正在进行的活动。按…

portraiture宿主插件最新v4中文版本下载及使用教程

自拍怎么可以不修图呢?如果要修图的话,磨皮就是其中非常重要的一环。皮肤看起来细腻光滑了,整个人的颜值都会瞬间拉高。下面就让我们介绍一下磨皮用什么软件好用,什么软件可以手动磨皮的相关内容。portraiture是ps人像修图中常用的…

喜报!恭喜知了堂学员成功通过CISP-PTE证书考试

有人说,大学可以不谈恋爱,但一定要考证。 考证,是大学校园生活的关键一环。充分利用在校时间为后期就业提前储备优势,毕业后如果从事IT领域,证书就是一个高含金量的专业认证,尤其是网络安全行业&#xff0…

干货|SpringBoot-Maven与Gradle多模块搭建

比较熟悉的模式是SpringbootMaven多模块的组织方式,由于近期Gradle势力很猛,据Gradle官网给出的5种压测场景的数据来看,Gradle的处理性能确实比Maven快,所以就来体验一下Gradle怎么做多模块搭建和各种依赖的引入和查看。 对Gradl…

【unity】燧光MR设备接入极简教程

官网说明文档: https://doc.ximmerse.com/sdkconf/unityxrsdk/index.html 一、环境准备 1、Unity环境准备 配置adb环境 官网下载:https://developer.android.google.cn/studio/releases/platform-tools 找到SDK Platform-Tools下载 参照 此教程 配置ad…

vulnhub dc-9

1.信息搜集 端口 80 20 filter 存活ip 172.16.1.65 2.访问网站进行信息搜集 cms staff 寻找漏洞 登录处尝试弱口令失败,尝试sql失败 search处sql注入 3.sqlmap跑用户名和密码 注意这题两个库的用户名和密码都需要 UserDetails,Users search处是post传参&…

trace clock structure的若干方法

这里分享几个trace clock structure的方法,各有特点。 1)report_clock_qor -to FF/CK -clock $clk_name -type structure 报告的结果与innovus的clock structure报告类似,如下示例。 (H) clock_root_name # sdc中的root name (0) cts_buf: A-> Y [REF: XX/BUF_XX] [Lo…

【Android开发基础】说说模块设计(下拉刷新、图片查看、布局设计)

文章目录 一、引言二、设计1、下拉刷新(1)依赖(2)使用 2、图片需求 三、结论 一、引言 描述:设计一个简单说说功能模块需求: 1、能够下拉刷新,更新数据 2、一条说说里允许包含多张图片&#xf…

第七章 Electron Vue3实现音乐播放器

一、介绍 🍑 🍑 🍑 一个音乐播放器应该具备播放、暂停、上一首、下一首、播放模式(单曲循环、列表循环、顺序播放……)。除了这些比如还可以扩展进度条的展示、拖拽、音量大小的调节,如果资源允许的话可以…

跨境电商开发的基本流程

在全球化的浪潮下,跨境电商已成为一个热门的商业模式。然而,很多人在跨境电商开发的过程中遇到了许多问题。本文将介绍跨境电商开发的流程,希望能够帮助大家更好地了解这个行业。 首先,跨境电商开发的第一步是寻找合适的产品。这…

DOC文件丢失怎么恢复?用这7种方法找回

在日常生活和工作中,我们经常会因为各种原因丢失重要的DOC文件,这给我们带来了不小的困扰。但是,不必担心,在本文中,我们将带大家了解一下DOC文件丢失怎么恢复。 关于DOC文件 DOC文件是指一种微软公司开发的文字处理软…

【短视频抖音多账号管理系统源码开发路径】

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 短视频矩阵系统开发涉及到多个领域的技术,包括视频编解码技术、大数据处理技术、音视频传输技术、电子商务及支付技术等。因此,短视频矩阵系统开发人员需要具备扎实的计算机基础知识、出色的编…

多边形三角化Earcut分析,以mapbox EarCut源码举例

多边形三角化,简单来说,就是给定一圈有序的多边形点生成三角面片,EarCut的原理描述网络上有很多(如https://blog.csdn.net/qq_24459491/article/details/102976671),就不细说了。但是有的时候看是一回事&am…

Ae 效果详解:Mocha AE

Ae菜单:效果/Boris FX Mocha/Mocha AE Effects/Boris FX Mocha/Mocha AE Ae菜单:动画/Track in Boris FX Mocha Animation/Track in Boris FX Mocha Mocha Pro 是一款强大的平面跟踪软件。既可作为独立软件运行,也提供了 Ae 的插件版本&#…

1.4C++运算符重载作函数

C运算符重载函数作为类成员函数 作为类成员函数时,运算符重载函数使用类的成员变量作为操作数。 写个 demo: 运算符重载函数作为类成员函数时,需要注意:运算符重载函数必须是类的成员函数,不能是普通函数或者全局函…