JVM 的不同组成部分分别有什么作用?

news2025/3/15 21:01:24

JVM(Java Virtual Machine)主要由以下几个核心组成部分构成:

1. 类加载器子系统 (Class Loader Subsystem):

  • 作用:

    • 加载类: 负责查找并加载 Java 类文件(.class 文件)到 JVM 中。 类文件可以来自本地文件系统、网络、JAR 包等。
    • 链接类: 将加载的类合并到 JVM 的运行时状态中,包括验证、准备和解析(可选)三个阶段。
      • 验证 (Verification): 确保类文件的结构符合 JVM 规范,并且不会危害 JVM 的安全。
      • 准备 (Preparation): 为类的静态变量分配内存,并设置默认初始值(例如,int 类型的默认值为 0,boolean 类型的默认值为 false)。
      • 解析 (Resolution): 将类、接口、字段和方法的符号引用解析为直接引用(可选,可以延迟到运行时)。
    • 初始化类: 执行类的初始化代码(静态变量赋值和静态代码块)。
  • 类加载器类型:

    • 启动类加载器 (Bootstrap Class Loader): 加载 Java 核心类库(<JAVA_HOME>/jre/lib)。
    • 扩展类加载器 (Extension Class Loader): 加载 Java 扩展类库(<JAVA_HOME>/jre/lib/extjava.ext.dirs 指定的目录)。
    • 应用程序类加载器 (Application Class Loader): 加载应用程序的类(classpath)。
    • 自定义类加载器: 开发者可以自定义类加载器,实现特殊的类加载逻辑。
  • 双亲委派模型: 除了启动类加载器,每个类加载器都有一个父类加载器。当一个类加载器需要加载类时,它首先会委托给父类加载器去加载,只有当父类加载器无法加载时,才由自己加载。

2. 运行时数据区 (Runtime Data Areas):

  • 作用: JVM 在运行 Java 程序时管理的内存区域,用于存储程序运行过程中需要的数据。
  • 主要区域:
    • 方法区 (Method Area):

      • 存储内容: 类信息(类名、父类、接口、字段、方法等)、常量、静态变量、即时编译器编译后的代码。
      • 共享性: 所有线程共享。
      • HotSpot VM 中的实现:
        • JDK 1.7 及之前:永久代 (Permanent Generation)。
        • JDK 1.8 及之后:元空间 (Metaspace)(使用本地内存)。
      • 运行时常量池 (Runtime Constant Pool): 方法区的一部分,存放编译期生成的各种字面量和符号引用。
    • 堆 (Heap):

      • 存储内容: 对象实例和数组。
      • 共享性: 所有线程共享。
      • 垃圾回收: 是垃圾回收的主要区域。
      • 划分: 通常划分为新生代(Young Generation)和老年代(Old Generation)。
        • 新生代又可以划分为 Eden 区、Survivor from 区和 Survivor to 区。
    • 虚拟机栈 (VM Stack):

      • 存储内容: 方法调用的局部变量、操作数栈、动态链接、方法出口等信息。
      • 共享性: 每个线程都有自己的虚拟机栈(线程私有)。
      • 栈帧 (Stack Frame): 每次方法调用都会创建一个栈帧,用于存储方法的局部变量等信息。方法执行完毕后,栈帧会被销毁。
      • 异常:
        • StackOverflowError: 线程请求的栈深度大于虚拟机允许的深度。
        • OutOfMemoryError: 虚拟机栈无法申请到足够的内存(如果可以动态扩展)。
    • 本地方法栈 (Native Method Stack):

      • 存储内容: 与虚拟机栈类似,但用于支持 native 方法(使用 C、C++ 等编写的方法)的执行。
      • 共享性: 每个线程都有自己的本地方法栈(线程私有)。
    • 程序计数器 (Program Counter Register):

      • 存储内容: 当前线程正在执行的字节码指令的地址(行号)。
      • 共享性: 每个线程都有自己的程序计数器(线程私有)。
      • 特点: 是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。

3. 执行引擎 (Execution Engine):

  • 作用: 负责执行 Java 字节码指令。
  • 主要组件:
    • 解释器 (Interpreter):

      • 逐条解释执行字节码指令。
      • 优点:启动速度快,不需要等待编译。
      • 缺点:执行速度慢,特别是对于频繁执行的代码。
    • 即时编译器 (JIT Compiler):

      • 将热点代码(经常执行的代码,例如循环体、频繁调用的方法)编译为本地机器码,提高执行效率。
      • 优点:执行速度快(接近本地代码)。
      • 缺点:编译需要时间,会增加启动时间。
      • HotSpot VM 中的 JIT 编译器:
        • Client Compiler (C1): 优化速度快,但优化程度较低。适用于客户端应用或对启动速度要求较高的场景。
        • Server Compiler (C2): 优化速度慢,但优化程度较高。适用于服务端应用或对性能要求较高的场景。
        • 分层编译 (Tiered Compilation): 根据程序的运行情况,选择不同的编译器进行优化。
          • 第 0 层: 解释执行。
          • 第 1 层: 使用 C1 编译,不开启 profiling。
          • 第 2 层: 使用 C1 编译,仅开启方法和循环回边的 profiling。
          • 第 3 层: 使用 C1 编译,开启所有 profiling。
          • 第 4 层: 使用 C2 编译。
    • 垃圾回收器 (Garbage Collector):

      • 负责自动回收不再使用的对象,释放内存。
      • 不同的 JVM 实现有不同的垃圾回收器。
      • 常见的垃圾回收器:
        • Serial GC
        • Parallel GC
        • CMS GC (Concurrent Mark Sweep)
        • G1 GC (Garbage-First)
        • ZGC
        • Shenandoah
    • 本地方法接口 (JNI, Java Native Interface):

      • 允许 Java 代码调用本地方法 (C/C++ 等编写的方法).

总结:

JVM 组成部分作用
类加载器子系统加载类文件(.class 文件)到 JVM 中,包括加载、链接(验证、准备、解析)和初始化三个阶段。
运行时数据区JVM 在运行 Java 程序时管理的内存区域,包括方法区、堆、虚拟机栈、本地方法栈、程序计数器。
执行引擎执行 Java 字节码指令,包括解释器、即时编译器、垃圾回收器。
本地方法接口(JNI)允许Java代码与本地代码(通常是C或C++)交互

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

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

相关文章

tomcat应用的作用以及安装,以及tomcat软件的开机自启动。

一.tomcat介绍 1.作用 tomcat是一款用来部署网站服务器的一款软件。 动态网站主流语言&#xff1a; PHP, lamp/lnmp平台 Java语言&#xff0c;运行在tomcat平台。【只要这个网站或者软件是Java语言写的&#xff0c;我们都可以在tomcat平台上去运行这个java程序。】 网站是…

Unity中WolrdSpace下的UI展示在上层

一、问题描述 Unity 中 Canvas使用World Space布局的UI&#xff0c;想让它不被3d物体遮挡&#xff0c;始终显示在上层。 二、解决方案 使用shader解决 在 UI 的材质中禁用深度测试&#xff08;ZTest&#xff09;&#xff0c;强制 UI 始终渲染在最上层。 Shader "Custo…

Redis的缓存雪崩、缓存击穿、缓存穿透与缓存预热、缓存降级

一、缓存雪崩&#xff1a; 1、什么是缓存雪崩&#xff1a; 如果缓在某一个时刻出现大规模的key失效&#xff0c;那么就会导致大量的请求打在了数据库上面&#xff0c;导致数据库压力巨大&#xff0c;如果在高并发的情况下&#xff0c;可能瞬间就会导致数据库宕机。这时候如果…

leetcode:728. 自除数(python3解法)

难度&#xff1a;简单 自除数 是指可以被它包含的每一位数整除的数。 例如&#xff0c;128 是一个 自除数 &#xff0c;因为 128 % 1 0&#xff0c;128 % 2 0&#xff0c;128 % 8 0。 自除数 不允许包含 0 。 给定两个整数 left 和 right &#xff0c;返回一个列表&#xff…

vue3-computed计算属性和reactive响应式系统结合使用

1.前言 vue3中使用reactive函数创建一个响应式对象&#xff0c;当对象数据发生变化的时候&#xff0c;依赖这些数据的计算属性和模板会自动的更新。 2.实例 2.1 简写 <template><div><p>用户名: {{ userName }}</p><p>用户名的大写形式: {{ u…

Pycharm 社区版安装教程

找到安装包双击安装文件---点击下一步 一般路径是&#xff1a;C:\Rambo\Software\Development 选择完成后就是如下地址&#xff1a; C:\Rambo\Software\Development\PyCharm Community Edition 2024.3.3 点击上述3个位置就可以了----下一步 等待安装就可以了---完成后点击完成…

Linux红帽:RHCSA认证知识讲解(六)创建、管理和删除本地用戶和组

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;六&#xff09;创建、管理和删除本地用戶和组 前言一、用户和组概念用户类型对比表格主要组和补充组对比表格&#xff1a; 二、本地用户账户增删改查三、本地组账户 前言 上篇博客我们详细了解了从红帽和 DNF 软件仓库下载…

分享vue好用的pdf 工具实测

vue3-pdf-app&#xff1a; 带大纲&#xff0c;带分页&#xff0c;带缩放&#xff0c;带全屏&#xff0c;带打印&#xff0c;带下载&#xff0c;带旋转 下载依赖&#xff1a; yarn add vue3-pdf-appornpm install vue3-pdf-app 配置类&#xff1a; 创建文件 pdfConfig.ts /…

Markdown Poster – 免费Markdown转图片工具|优雅图文海报制作与社交媒体分享

Markdown Poster是什么 Markdown Poster 是一款高效的 Markdown 转图片工具&#xff0c;利用灵活编辑和实时预览功能帮助用户轻松制作优雅的图文海报。该工具内置丰富的海报模板和多种主题选项&#xff0c;支持导出为图片和 HTML 代码&#xff0c;适用于社交媒体分享、网站集成…

掌握市场先机:9款销售渠道管理工具深度测评

本文主要介绍了以下9款销售渠道管理工具&#xff1a;1.纷享销客&#xff1b; 2.销帮帮&#xff1b; 3.小满CRM&#xff1b; 4.有赞&#xff1b; 5.Oracle NetSuite&#xff1b; 6.Salesforce Sales Cloud&#xff1b; 7.Cin7&#xff1b; 8.Pipedrive&#xff1b; 9.BigCommerc…

OpenCV图像加权函数:addWeighted

1 addWeighted函数 在OpenCV 里&#xff0c;addWeighted 函数的作用是对两个图像进行加权求和&#xff0c;常用于图像融合、图像过渡等场景。函数如下&#xff1a; cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])2 参数解释 src1&#xff1a;第一个输入图…

docker桌面版启动redis,解决无法连接

docker run -d --name redis -p 6379:6379 -v E:\2\redis\redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf 在本地创建一个目录&#xff0c;里面有个redis.conf文件&#xff0c;内容如下&#xff0c;启动时绑定这个配置文件目…

Scratch 3.0安装包,支持Win7/10/11、Mac电脑手机平板、少儿便编程的启蒙软件。

Scratch是一款由麻省理工学院&#xff08;MIT&#xff09; 设计开发的少儿编程工具。其特点是&#xff1a;使用者可以不认识英文单词&#xff0c;也可以不使用键盘&#xff0c;就可以进行编程。构成程序的命令和参数通过积木形状的模块来实现。用鼠标拖动指令模块到脚本区就可以…

Navicat for Snowflake 震撼首发,激活数据仓库管理全新动能

近日&#xff0c;Navicat 家族迎来了一位全新成员 — Navicat for Snowflake。Snowflake 是一款基于云架构的现代数据仓库解决方案&#xff0c;以其弹性扩展、高性能和易用性著称。这次首发的Navicat for Snowflake 专为简化 Snowflake 数据库管理任务而精心打造。它凭借其直观…

深度学习基础:线性代数本质2——线性组合、张成的空间与基

目录 一、线性组合 1. 用一个有趣的角度看向量坐标 2. 如果我们选择不同的基向量会怎样&#xff1f; 3. 线性组合 4. 张成的空间 ① 二维向量的张成的空间 ② 三维向量的张成的空间​编辑 5.线性相关 6.线性无关 7. 基的定义 一、线性组合 1. 用一个有趣的角度看向量坐…

第五天 Labview数据记录(5.4 EXCEL文件读写)

5.4 EXCEL文件读写 Excel 文件读写在数据处理、自动化办公、数据分析等领域具有重要的意义。以下是 Excel 文件读写的主要应用场景和意义&#xff1a;1. 数据管理和整理&#xff1b;2. 自动化办公&#xff1b;3. 数据分析和可视化&#xff1b;4. 系统集成&#xff1b;5. 报表生…

注意力机制,层归一化,RBA。KAN-ODE,小波KAN

目录 attention is all you need 翻译 多头注意力 8.6 Multi-head Self Attention 模型 模型架构 encoder安定 decode 注意力机制 位置编码 自注意力机制的优势 实验结果 结论 代码 Transformer 架构 代码实现思路 总结 编码器、解码器和位置编码的摆放顺序&…

电脑内存不足怎么办?

常规解决方法盘点 关闭后台程序&#xff1a;按下【Ctrl Shift Esc】组合键打开任务管理器&#xff0c;在 “进程” 选项卡里&#xff0c;把当前不用的程序统统 “结束任务” &#xff0c;像那些自动更新的软件、常驻后台的播放器&#xff0c;关了能释放不少内存。比如音乐软…

【RISCV LAB】0x01-安装实验仿真辅助工具

安装实验辅助工具 实验环境搭建安装 Verilator编译依赖下载源码编译安装测试安装 安装 RISC-V 交叉编译工具链编译依赖下载源码编译安装编译并安装添加环境变量并测试 安装 GTKWave其他模拟器推荐RARSemulsiV FAQ 实验环境搭建 Verilator 是一款开源的支持 Verilog 和 SystemV…

Trae插件革命:用VSPlugin Helper实现VSCode市场插件全自动安装

之前有读者留言说trae都没有c的插件用&#xff0c;确实是这样&#xff0c;trae的插件源用的是open vsx&#xff0c;而c/c插件是vscode官方插件市场的&#xff0c;如果想直接在trae中安装c/c插件是不行的&#xff0c;只能先从vscode官方插件市场把vsix后缀文件先下载下来&#x…