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

JVM是什么?

  • JVM是什么?

JVM,即Java Virtual Machine,即Java虚拟机

  • 虚拟机是什么?

模拟出一台和真实物理电脑行为几乎一样的虚拟电脑软件。(JVM是进程虚拟机,不模拟硬件,只模拟一套自定义虚拟指令集,专门用来跑编程语言代码,和物理CPU无关)

  • 为什么要模拟真实物理电脑?

解决Java程序跨平台运行的问题。

  • 什么是跨平台运行?

一份软件或程序代码不需要修改源码不用重新编译,就能在多种不同操作系统、不同 CPU 硬件架构上直接正常运行。

  • 为什么需要跨平台运行?

多平台需要搭建多套编译环境,维护成本极高;第三方依赖极易出现编译失败、兼容性问题;给普通用户使用时,用户根本不会编译;版本分发、升级维护极其繁琐。

  • 为什么能解决Java程序跨平台运行问题?

C/C++ 源码编译后直接生成当前 CPU + 操作系统的原生机器码程序。

Java源码编译生成在JVM上执行的字节码文件。

综上所述

JVM是用于执行Java字节码的虚拟机。

另外,它还提供类加载内存管理垃圾回收等运行时支持。


接下来看JVM是如何工作的

真正的计算机有CPU、内存、寄存器、程序计数器、指令执行,作为虚拟机,JVM里也有程序计数器(PC)、栈(Stack)、堆(Heap)、方法区(Method Area)、执行引擎(Execution Engine)。

JVM运行流程

前置工作:Java源代码编译成class字节码文件(javac执行)。

  • 类加载器读取并解析 .class 文件,在运行时数据区创建类的运行时数据结构;
  • 执行引擎读取这些字节码,通过解释执行或 JIT 编译生成机器码,最终由 CPU 执行(在这个过程中,垃圾回收也在工作)。

其中需要详细了解一下运行时数据区垃圾回收

运行时数据区

运行时数据区,即JVM内存结构,包括:程序计数器、虚拟机栈、本地方法栈、堆、方法区。

1、程序计数器:记录当前线程正在执行的字节码指令的地址

2、虚拟机栈:

  • 每次函数调用都会有一个对应的栈帧被压入(栈帧存储方法参数、方法内局部变量、方法放回地址)
  • 方法递归过多会导致java.lang.StackOverflowError 栈内存溢出

3、本地方法栈:调用本地函数时,压入对应栈帧(以native修饰的方法就是本地方法,本地方法是C/C++编写的,Java通过接口调用,Java通过本地方法调用操作系统底层功能)

4、堆:保存对象实例(垃圾收集器管理的主要区域)

5、方法区:

  • 存储类信息、常量、静态变量
  • JDK7方法区的实现叫:永久代,占用的是堆的内存空间,大小固定
  • JDK8方法区的实现叫:元空间,占用的是本地内存的空间,大小自动调整
垃圾回收
  • 是什么?

自动管理内存的一种机制。自动释放不再被程序引用对象所占用的内存

判断对象是否还被引用:可达性分析算法

  • 垃圾回收算法
  1. 标记清除:标记存活对象(被引用对象)和垃圾对象(不被引用对象),回收垃圾对象;
  2. 标记整理:标记存活对象和垃圾对象,将存活对象向一端移动,清理边界以外的内存空间;
  3. 复制法:内存分为大小相等的两块,只使用其中一块,这一块使用完之后,将存活对象复制到另一块内存中,清理这一块的所有内存空间;
优点缺点
标记清除回收速度快会产生内存碎片
标记整理不会产生内存碎片效率较低
复制法不会产生内存碎片且较为高效内存缩小为原来的一半
  • 分代垃圾回收

一般不单独使用某一种垃圾回收算法。

分为新生代老年代

新生代中存储存活率低的对象,采用复制法(频繁回收,要高效一点);

老年代中存储存活率高的对象,采用标记整理法(很久回收一次,效率低一点可以接受)。

http://www.jsqmd.com/news/1123721/

相关文章:

  • 良心盘点!2026AI论文写作工具榜单(覆盖 99% 学生论文写作需求)
  • YOLOv13超图视觉与NCNN部署实战指南
  • Wwise音频文件处理终极指南:3分钟掌握游戏音效解包与定制
  • 如何用大模型设计一个“国标级“智能体:从 prompt 到落地的完整指南
  • 【OpenHarmony/HarmonyOs 】实验室首页细节拆解:分类侧栏、搜索筛选与推荐探索交互
  • 小程序基础库3.16.0实战指南:NFC/离线运行/双端适配/接口迁移代码落地及公众号迁移公证书线上办理流程
  • IBM ODM JNDI注入漏洞CVE-2024-22319复现与深度解析
  • 91.吃透 PLC 底层!扫描周期 + 状态机物料分拣,全套 ST 源码
  • python___模块
  • 如何快速解决Windows热键冲突:终极热键检测工具使用指南
  • OpCore Simplify技术深度解析:揭秘黑苹果自动化配置的核心原理
  • 安卓手机 SIM 卡迁移至新款 iPhone 17/16?
  • 免费获取百度文库文档的终极方案:开源页面清理脚本完整指南
  • Elsevier投稿状态追踪插件:科研工作者的智能审稿监控工具
  • 如何用BilibiliDown三步搞定B站视频下载?小白也能掌握的完整指南
  • 影刀RPA新手教程:财务报表自动汇总完全指南——多Excel合并数据透视与自动发邮件
  • Crypto++实战指南:从CRC32到RSA的C++加密库集成与应用
  • 3分钟掌握抖音内容下载:免费工具助你高效保存视频、直播和合集
  • STM32F072RB与SLO2016构建工业隔离通信系统
  • AI专著撰写实用技巧:利用AI工具,快速生成20万字专著的方法!
  • 基于策略模式与智能降级的高性能抖音下载器架构设计
  • AI模型工作流横评:端到端业务链路实战测评
  • 资深后端工程师分享:技术栈选型背后的思考
  • Pyfa终极指南:5个技巧快速掌握EVE Online免费Python舰船配装工具
  • OpenHarmony Image 图片组件全场景开发与 API23 + 适配优化
  • 排序算法百科全书:从基础到精进的完整指南
  • Sonnet 4.6 实测:中端模型如何以1/5成本实现95% Opus级工程能力
  • Claude Sonnet 4.6办公能力重构:从操作计算机到指挥知识系统
  • Codex 用户集体暴怒!Token疯狂蒸发的 5 个原因终于找到了
  • 计算机毕业设计之基于Java的旅游网站的设计与实现