JVM 的组成
JVM 的组成
JVM(Java Virtual Machine)是 Java 的核心组件,负责执行 Java 字节码程序。以下是 JVM 的主要组成部分:
1. 类加载子系统(Class Loader Subsystem)
- 作用:负责加载
.class文件到 JVM,将其转换为 JVM 能识别的内部数据结构。 - 组成:
- Bootstrap ClassLoader(引导类加载器):加载 JDK 核心类库(
rt.jar)。 - Extension ClassLoader(扩展类加载器):加载扩展库(
lib/ext中的类)。 - Application ClassLoader(应用类加载器):加载应用程序的类路径中的类。
- Bootstrap ClassLoader(引导类加载器):加载 JDK 核心类库(
- 过程:
- 加载(Loading):通过文件、网络等方式加载
.class文件。 - 验证(Verification):确保字节码文件的合法性和安全性。
- 准备(Preparation):为类的静态字段分配内存并赋默认值。
- 解析(Resolution):将符号引用转换为直接引用。
- 初始化(Initialization):执行类的静态代码块或初始化静态字段。
- 加载(Loading):通过文件、网络等方式加载
2. 运行时数据区(Runtime Data Area)
JVM 为执行 Java 程序分配的内存区域,包括以下部分:
a. 方法区(Method Area)
- 存储:
- 类元信息(类名、方法名、字段名等)。
- 静态变量。
- 运行时常量池。
- 特点:
- 是线程共享的。
- 在 JDK 8 以前对应于永久代(PermGen),在 JDK 8 后改为元空间(Metaspace)。
b. 堆区(Heap Area)
- 存储:
- 所有对象实例和数组。
- 特点:
- 是线程共享的。
- 垃圾回收(GC)主要针对堆区。
- 通常分为年轻代(Young Generation)、老年代(Old Generation)和永久代(PermGen,JDK 8 以后移除)。
c. Java 栈区(Java Stack Area)
- 存储:
- 方法调用的局部变量。
- 每个方法调用对应一个栈帧(Frame)。
- 特点:
- 是线程私有的。
- 方法调用结束后,栈帧会弹出,内存自动回收。
d. 程序计数器(Program Counter Register)
- 功能:
- 记录当前线程正在执行的字节码指令地址。
- 特点:
- 是线程私有的。
e. 本地方法栈(Native Method Stack)
- 功能:
- 为本地方法(非 Java 方法,如通过 JNI 调用的 C 或 C++ 方法)服务。
- 特点:
- 是线程私有的。
3. 执行引擎(Execution Engine)
- 作用:负责执行字节码。
- 组成:
- 解释器(Interpreter):逐条解释字节码并执行。
- 即时编译器(JIT Compiler):
- 热点代码(频繁执行的代码)会被 JIT 编译为机器码,以提高执行速度。
- 包括 C1(Client Compiler,快速编译)和 C2(Server Compiler,高性能优化)。
- 垃圾回收器(Garbage Collector,GC):
- 自动回收不再使用的对象所占的内存。
4. 本地方法接口(Native Interface)
- 作用:提供调用非 Java 代码(如 C、C++)的接口。
- 工作机制:
- 通过 JNI(Java Native Interface)调用本地方法。
- 实现与底层操作系统和硬件的交互,如文件系统、网络操作。
5. JVM 内存模型(Java Memory Model, JMM)
- 作用:定义线程如何交互以及如何访问内存。
- 主要内容:
- 主内存(Main Memory):所有线程共享的内存区域。
- 工作内存(Working Memory):每个线程独立的内存区域,用于存储线程私有的数据。
- 可见性:规定线程对共享变量的修改如何被其他线程看到。
- 原子性:确保基本操作的不可分割性。
- 有序性:保证程序的执行顺序符合预期。
6. JVM 垃圾回收子系统
- 作用:自动管理内存,回收不再使用的对象。
- 常用算法:
- 标记-清除算法。
- 标记-压缩算法。
- 复制算法。
- 分代收集算法。
- 常见垃圾回收器:
- Serial GC、Parallel GC、CMS、G1 GC、ZGC、Shenandoah 等。
JVM 的工作原理
- 加载类:通过类加载子系统加载
.class文件。 - 分配内存:在堆、栈等区域分配对象和方法的内存。
- 执行字节码:通过执行引擎逐条解释或即时编译代码并运行。
- 垃圾回收:定期清理无用的对象,释放内存。
总结
JVM 的组成模块紧密协作,为 Java 程序提供了一个高效、安全、跨平台的运行环境。每个部分都有其特定功能,共同构成了完整的 JVM。
JVM 的组成的更多相关文章
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
- java 利用ManagementFactory获取jvm,os的一些信息--转
原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- JVM类加载
JVM的类加载机制就是:JVM把描述类的class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型 ClassLoader JVM中的ClassLoade ...
- Java虚拟机 JVM
finalize();(不建议使用,代价高,不确定性大) 如果你在一个类中覆写了finalize()方法, 那么你可以在第一次被GC的时候,挽救一个你想挽救的对象,让其不被回收,但只能挽救一次. GC ...
- 在 Linux 中安装 Oracle JDK 8 以及 JVM 的类加载机制
参考资料 该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference .Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以直接找 ...
- MapReduce剖析笔记之六:TaskTracker初始化任务并启动JVM过程
在上面一节我们分析了JobTracker调用JobQueueTaskScheduler进行任务分配,JobQueueTaskScheduler又调用JobInProgress按照一定顺序查找任务的流程 ...
- java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)
尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...
- Jvm --- 常用工具
jps:虚拟机进程状况工具 JVM Process Status Tool. 可以列出所有目前正在运行虚拟机的进程. jps -l 详细参数: -q 输出LVMID,省略主类名称 -m 输出虚拟机进程 ...
- JVM虚拟机结构
JVM的主要结构如下图所示,图片引用自舒の随想日记. 方法区和堆由所有线程共享,其他区域都是线程私有的 程序计数器(Program Counter Register) 类似于PC寄存器,是一块较小的内 ...
随机推荐
- 接口(interface):实例化时要覆盖所有抽象方法,否则仍为抽象类
概述 /* * 接口的使用 * 1.接口使用interface来定义 * 2.Java中,接口和类是并列的两个结构 * 3.如何定义接口:定义接口中的成员 * * 3.1 JDK7及以前:只能定义全局 ...
- 通过串口通信 对TCP传输层以下的理解
这可能是近期暂时最后一篇c嵌入式的文章了 基础的串口使用 参照网上的stm32教程套路引入标准库,初始化芯片手册上对应串口引脚 ,初始化stm32串口功能,然后有数据了就自然在寄存器上,就这样,你的波 ...
- 数字先锋 | SaaS服务“拎包入住”?央企数字化转型体验感拉满!
数字化转型已成为企业生存和发展的"必修课".作为国民经济的"压舱石""顶梁柱",国资央企正加快"上云用数赋智"步伐,引领 ...
- 手把手教你喂养 DeepSeek 本地模型
上篇文章<手把手教你部署 DeepSeek 本地模型>首发是在公众号,但截止目前只有500多人阅读量,而在自己博客园BLOG同步更新的文章热度很高,目前已达到50000+的阅读量,流量是公 ...
- mac安装nodejs、npm包设置
一.安装nodejs 1.下载自己系统的nodejs,我选择18.20版本 https://nodejs.cn/download/ 二.设置 1.设置镜像源: npm config set regis ...
- Luogu P5298 PKUWC2018 Minimax 题解 [ 紫 ] [ 树形 dp ] [ 线段树合并 ] [ 概率 dp ]
Minimax:线段树合并优化 dp 好题. 树形 dp 因为要求出每一个值的出现概率,首先我们可以想到一个很暴力的 dp 式子. 定义 \(dp_{i,j}\) 表示在节点 \(i\) 时,权值 \ ...
- 在线客服的独立产品之路:如何将复杂的 .NET 系统打包到 Docker 镜像,使之能一键上线
我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统.陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营 ...
- Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
Deepseek卡的问题已经有几周了,还有同学没有解决这个问题? 今天就来教大家如何白嫖阿里云的Deepseek-R1满血版,新用户享受100万token额度,相当的富裕,可以随便用了.并且还配用AP ...
- [WC2006] 水管局长 题解
最大值最小的路径肯定在最小生成树上,考虑用 \(LCT\) 维护最小生成树,只需要维护长度最长的边即可实现.由于 \(LCT\) 维护最小生成树不支持删边,所以采用倒序加边的方式处理. 时间复杂度 \ ...
- [JOISC2019] 聚会 题解
随机化好题,但是不会证. 考虑把树看成一条链,链的每个点上缀了一棵树. 那么先随机出两个点 \(x,y\)(实际上随机一个点,另一个点固定似乎更好?),然后对于当前这棵树上的任意点 \(z\),都让他 ...