当前位置: 首页 > news >正文

JVM的元空间了解吗?

笔者近期在面试的时候被问到了这个问题,元空间也是Java8当时的一大重大革新,之前暑期实习求职的时候有专门看过,但是近期秋招的时候JVM相关的内容确实有点生疏了,故在此进行回顾。


结构

首先,我们应了解JVM的堆结构,主要有两个版本及Java7以及Java8。

堆内存结构

元空间的前身-永久代(Permanent Generation)

JAVA永久代的演化

  • JDK7开始,字符串常量和符号引用等就被移出永久代,字符串字面量迁移至Java堆 /符号引用转移到了native heap。
  • JDK8,永久代被彻底地移出了JVM,取而代之的是元空间MetaSpace,把类的元数据放到本地化的堆内存native heap中,这块区域就叫Metaspace。

JDK 1.7 为什么要将字符串常量池移动到堆中?

主要是因为永久代(方法区实现)的 GC 回收效率太低,只有在整堆收集 (Full GC)的时候才会被执行 GC。Java 程序中通常会有大量的被创建的字符串等待回收,将字符串常量池放到堆中,能够更高效及时地回收字符串内存。

作用

JVM的MetaSpace存储JVM的元信息,而且是在堆外存储。主要涉及以下内容:

  • JVM中类的元数据在Java堆中的存储区域
  • Java类对应的HotSpot虚拟机中的内部表示也存储在这里
  • 类的层级信息,字段,名字
  • 方法的编译信息及字节码
  • 变量
  • 常量池和符号解析

注意到,堆外内存就是把内存对象分配在堆(新生代+老年代+永久代)以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。

理论上以上信息占用的内存空间在服务启动后就会比较稳定,并不会出现上文中提到的一直增长的,甚至导致OOM的情况出现。


回到正题,元空间的引入是为了替代原来使用的 PermGen 区域,PermGen 区域主要用于存储永久代(Permanent Generation)中的类信息和常量池信息。随着Java应用程序对内存需求的不断增加,PermGen 区域经常会出现内存泄漏和 OutOfMemoryError 的问题,因此引入了元空间来解决这些问题。

元空间的大小可以通过参数配置的方式指定。在启动JVM时,可以使用以下参数来指定元空间的大小:

-XX:MaxMetaspaceSize:指定元空间的最大大小,单位是字节。

-XX:MinMetaspaceSize:指定元空间的最小大小,单位是字节。

-XX:InitialMetaspaceSize:指定元空间的初始大小,单位是字节。

这些参数可以通过命令行或配置文件的方式传递给JVM。在默认情况下,元空间的大小是动态调整的,根据应用程序的需要自动扩展或缩小。当元空间快要达到最大或最小大小时,JVM会尝试进行垃圾回收来释放不再使用的类信息和常量池信息。


参考资料

JVM Metaspace OOM的排障以及原理分析 - 掘金

https://www.cnblogs.com/snowwhite/p/9532311.html

Java内存区域详解(重点) | JavaGuide(Java面试 + 学习指南)

http://www.lryc.cn/news/133985.html

相关文章:

  • WPS中的表格错乱少行
  • Pytorch-day09-模型微调-checkpoint
  • leetcode304. 二维区域和检索 - 矩阵不可变(java)
  • 记一次oracle数据库迁移至mysql数据库(表同步)
  • 打怪升级之从零开始的网络协议
  • Lnton羚通算法算力云平台【PyTorch】教程:torch.nn.Softsign
  • 读SQL学习指南(第3版)笔记02_数据类型
  • 易思智能物流无人值守系统文件上传漏洞复现
  • git获取远端分支和merge
  • linux-进程
  • 整数数组区间的插入与删除
  • Git标签
  • BarCodeWiz ActiveX Control Crack
  • mysql高版本(8.0+)group_by报错的处理方法
  • Java 下载压缩zip
  • GTK3实现自定义列表
  • Go语言基础之数组
  • 信息安全从业者考试认证大全
  • 详解react 15~18新增特性
  • SpringBoot整合FFmpeg进行视频分片上传(Linux)
  • eNSP综合小实验:VRRP、MSTP、Eth-Trunk、NAT、DHCP等技术应用
  • 正中优配:尾盘拉升的股票第二天的走势?
  • ios小组件报错:Please adopt containerBackground API
  • 基于AWS的3D模型搜索服务实现
  • pycharm远程连接docker容器
  • 开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)
  • RT-Thread学习日记——点亮LED
  • 粘包问题(TCP面向字节流批量发送数据导致)
  • selenium Chrome驱动下载地址
  • Linux命令200例:tar命令主要用于创建、查看和提取归档文件(常用)