JVM中类加载器通过I/O流读取.class文件到元空间MetaSpace的字节码内存流转

冰川箭仙

冰川箭仙

2026-07-24

461人浏览

原创

类加载器不直接将.class文件塞入元空间,而是通过“读取→解析→构建→封装”四步流程:先以io方式获取byte[]字节流(来自文件、jar、网络或动态生成),再由jvm校验格式、构建元空间运行时结构、暂存符号引用,最后在堆中创建class对象作为访问元数据的入口。

jvm中类加载器通过i/o流读取.class文件到元空间metaspace的字节码内存流转

类加载器并不直接把.class文件“塞进”元空间,而是通过一套有职责分工的流程,把原始字节流逐步转化为JVM可识别、可运行的类元数据。整个过程本质是“读取 → 解析 → 构建 → 封装”,不是简单的IO复制。

字节码怎么被读出来?

类加载器根据全限定名定位资源,再用I/O方式获取原始byte[]:

  • 从本地文件系统读取(如FileInputStreamMyClass.class
  • 从JAR/WAR/ZIP等归档中解压提取(URLClassLoader常这么做)
  • 通过网络下载(比如远程类加载、热更新场景)
  • 甚至不依赖磁盘——由ASM、CGLIB等工具动态生成字节数组

此时得到的只是纯二进制数据,没有JVM语义,也不含任何内存地址信息。

字节流怎么变成元空间里的元数据?

JVM在加载阶段内部完成三步转化,不是“粘贴过去”:

  • 校验格式:检查魔数(0xCAFEBABE)、主次版本号、常量池结构,确保符合Class文件规范
  • 构建运行时结构:在元空间分配内存,填充类名、父类、接口、字段描述符、方法签名、访问标志、注解等——这才是真正的“类元数据”
  • 暂存符号引用:把类、字段、方法的字符串名称(如"java/lang/Object")先存着,留到解析阶段转成直接内存地址

注意:此时方法体字节码已载入元空间,但尚未验证或链接,还不能执行。

byte-units-master转换字节单位的PHP库
byte-units-master转换字节单位的PHP库

byte-units-master转换字节单位的PHP库

下载

Class对象和元空间的关系是什么?

Class对象是Java层可见的入口,它本身存在堆中,但指向元空间里那块刚构建好的元数据:

  • 每个被加载的类,在元空间中只有一份元数据模板
  • Class对象就像一个“句柄”,封装了对这份元数据的访问能力
  • 后续创建实例(new对象)时,JVM依据这个模板在堆中分配内存、初始化字段

也就是说,元空间存的是“类的定义”,Class对象是“通往定义的钥匙”。

元空间和老的永久代有什么关键区别?

JDK 8起用元空间替代永久代,核心变化在于内存来源和管理逻辑:

  • 元空间使用本地内存(Native Memory),不受堆大小限制
  • 默认无上限,靠-XX:MaxMetaspaceSize防无限膨胀
  • 类元数据(包括运行时常量池、字段/方法数据、符号表等)全部存放其中
  • GC会回收不再使用的类元数据,但触发条件与堆GC不同,通常由元空间容量阈值驱动

不复杂但容易忽略:元空间不是“只存类”,它还承载了类加载器自身的信息、字符串常量、数字常量等关联数据。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

2024.01.03

1746

7

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

2025.12.06

182

9

Qt Creator编译运行使用教程
Qt Creator编译运行使用教程

围绕 Qt Creator 编译、运行、构建错误、断点调试、变量查看、调用栈、Debug与Release切换、编译输出和运行日志展开,帮助用户处理程序无法运行、断点不生效、找不到库文件、构建失败等问题。

2026.08.05

0

10

Qt Creator按钮响应设置方法
Qt Creator按钮响应设置方法

信号槽是 Qt 开发的核心机制。本专题整理 Qt Creator 中按钮点击、菜单触发、输入变化、窗口事件、自定义信号、自动连接槽函数和手动 connect 写法,帮助用户理解界面控件如何和 C++ 代码联动。

2026.08.05

0

10

Qt Creator新建项目使用教程
Qt Creator新建项目使用教程

本专题整理 Qt Creator 新建项目、打开已有工程、项目模板选择、目录结构、源文件管理、构建目录、运行配置和项目迁移方法,重点解决新手不知道选 qmake 还是 CMake、项目打不开、文件不参与编译等常见问题。

2026.08.05

0

10

maven常用插件使用大全
maven常用插件使用大全

PHP中文网精心整理Maven主流插件用法合集,涵盖编译、测试、打包等常用插件使用大全。从基础配置到进阶实战,详细解析各插件功能与适用场景,助你轻松掌握Maven自动化构建,解决Java项目开发痛点,是开发者必备的实用指南。

2026.08.05

0

31

PyCharm快速入门指南
PyCharm快速入门指南

本专题汇总了PyCharm快速入门的全套指南与教程,涵盖从官网下载安装、创建第一个Python项目、配置虚拟环境,到代码编辑、运行调试等基础操作,并整理了版本控制(Git)集成、常用高效快捷键及实用插件等进阶技巧,助你快速上手这款高效的Python IDE。

2026.08.05

2

17

PyCharm运行程序教程大全
PyCharm运行程序教程大全

本专题汇总了PyCharm运行程序的多种方式与详细操作步骤,涵盖通过主菜单Run、点击工具栏绿色三角图标、使用快捷键Shift+F10(或Ctrl+Shift+F10)等基本运行方法,以及配置运行/调试参数、设置PYTHONPATH环境变量、管理多脚本运行与交互式Python控制台调试等进阶技巧,助您全面掌握在PyCharm中高效运行与管理Python程序的方法。

2026.08.05

0

14

Maven零基础入门教程
Maven零基础入门教程

本合集由PHP中文网精心整理,提供Maven零基础入门到完整使用的保姆级教程。内容涵盖环境安装、核心配置、仓库管理及项目构建等核心知识点。通过详细步骤解析与代码示例,助你快速掌握Maven的依赖管理与自动化构建,轻松解决Java项目中的各种痛点,是新手入门与进阶的必备指南。

2026.08.05

2

18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程