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

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介

Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以在多种平台上不加修改地运行‌。

1.1 JVM 的基本组成

JVM 主要由以下几个部分组成:

  1. 类加载器‌:负责将 .class 文件加载到内存中。
  2. ‌执行引擎‌:负责解释执行字节码或通过即时编译(JIT)将其转换为机器码。
  3. ‌运行时数据区‌:包括堆、栈、方法区和程序计数器等,用于存储程序运行时的数据和状态。
  4. ‌本地接口‌:用于融合不同的编程语言,虽然使用较少,但在需要与硬件交互时仍然重要‌。

1.2 JVM 的运行流程

  1. 编译‌:Java 源代码通过 javac 编译器编译成字节码(.class文件)。
  2. ‌类加载‌:类加载器将字节码文件加载到 JVM 的内存中。
  3. ‌执行‌:执行引擎解释或编译字节码,并提交操作系统执行。
  4. ‌垃圾回收‌:自动管理内存,防止内存泄漏和溢出‌。

1.3 JVM 的跨平台特性

JVM 的跨平台特性使得 Java 程序可以在任何支持 JVM 的操作系统上运行,实现了“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的目标。这是通过 JVM 屏蔽底层硬件和操作系统的差异,提供统一的字节码规范来实现的‌。

2、JVM 的内存结构

JVM 在执行 Java 程序的时候,为了便于管理,会把它所管理的内存划分为多个不同区域。

JVM 的内存结果如下图:

2.1 字节码文件(class 文件)

字节码文件(class 文件)是 Java 程序编译后生成的中间代码,这些中间代码将会被 JVM 解析并执行。字节码文件是 Java 源代码(.java)编译后生成的中间代码文件(.class),采用二进制格式存储,包含 JVM 可执行的指令集。与机器码不同,字节码是平台无关的中间表示,需由 JVM 解释或即时编译(JIT)为机器码执行。

2.2 类加载器(ClassLoader)

类加载器子系统负责把 class 文件转载到内存中,供虚拟机执行。

2.3 方法区(Method Area)

方法区用来存储被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。在类加载器加载 class 文件的时候,这些信息将会被提起出来,并存储到方法区中。由于这个区域是所有线程共享的区域,因此,它被设计为线程安全的。方法区可以被看出 JVM 的一个规范,在 HotSpor 中,方法区是用 Perm 区来实现的方法区。

2.4 ‌堆(Heap)

堆是虚拟机启动的时候创建的被所有线程共享的区域。这块区域只要用来存储对象的实例,通过 new 操作创建出来的对象的实例都存储在堆空间中,因此,堆就成为垃圾回收器管理的重点区域。

2.5 程序计数器(Program Counter Register)

程序计数器用于记录当前线程执行字节码的指令地址(行号指示器&#x

http://www.lqws.cn/news/178075.html

相关文章:

  • 使用 Mechanical 脚本获取联合反作用力和力矩
  • Linux 服务管理与自启动配置全解析:rc.d、systemctl与service对比
  • 物联网嵌入式开发实训室建设方案探讨(高职物联网应用技术专业实训室建设)
  • 【使用conda】安装pytorch
  • 力扣刷题(第四十九天)
  • 【redis实战篇】第八天
  • 越狱蒸馏-可再生安全基准测试
  • Science Robotics:UCLA 贺曦敏团队综述自主软体机器人
  • 绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
  • AI大模型学习三十三、HeyGem.ai 服务端(ubuntu)docker 安装 /客户端(win)分离部署
  • 【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
  • 智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
  • vscode使用系列之快速生成html模板
  • LlamaFactory × 多模态RAG × Chat-BI:万字长文探寻RAG进化轨迹,打造卓越专业AI助手
  • 安卓基础(ProGuard vs R8)
  • FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
  • 【Linux】Linux 进程间通讯-管道
  • gitlab CI/CD本地部署配置
  • WebRTC 与 WebSocket 的关联关系
  • 【JVM】Java虚拟机(一)——内存结构
  • Qt生成日志与以及报错文件(mingw64位,winDbg)————附带详细解说
  • 在Windows下利用LoongArch-toolchain交叉编译Qt
  • 【PmHub面试篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现面试专题解析
  • 数据库SQLite基础
  • Ubuntu18.6 学习QT问题记录以及虚拟机安装Ubuntu后的设置
  • 【Qt】:设置新建类模板
  • C/C++ 面试复习笔记(4)
  • Excel 发现此工作表中有一处或多处公式引用错误。请检查公式中的单元格引用、区域名称、已定义名称以及到其他工作簿的链接是否均正确无误。弹窗
  • 关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
  • excel数据对比找不同:6种方法核对两列数据差异