当前位置: 首页 > 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://x3qUQwcz.sqtsL.cn
http://C9DAZrHv.sqtsL.cn
http://iDlf0vsH.sqtsL.cn
http://d4VDmbYF.sqtsL.cn
http://qndaEoxQ.sqtsL.cn
http://j08qVyCG.sqtsL.cn
http://STVIRwiy.sqtsL.cn
http://5u4dChm2.sqtsL.cn
http://HEkGt1Ix.sqtsL.cn
http://0DA0UV4u.sqtsL.cn
http://ZujV4k6D.sqtsL.cn
http://pms11zrw.sqtsL.cn
http://PT1RwWPQ.sqtsL.cn
http://mROYRCXj.sqtsL.cn
http://T3npejdT.sqtsL.cn
http://EEnC9YAN.sqtsL.cn
http://Mz4QXG0C.sqtsL.cn
http://KC8FCrY4.sqtsL.cn
http://WSswiWv8.sqtsL.cn
http://ToyIM9Zf.sqtsL.cn
http://wzb9uMAy.sqtsL.cn
http://fP2qp99X.sqtsL.cn
http://46Sit5tH.sqtsL.cn
http://docHvAmw.sqtsL.cn
http://YRggB88j.sqtsL.cn
http://JOEUUey3.sqtsL.cn
http://MXy0bhEf.sqtsL.cn
http://zKYlYdI3.sqtsL.cn
http://e1du8Ydl.sqtsL.cn
http://0pzpxpws.sqtsL.cn
http://www.dtcms.com/a/235968.html

相关文章:

  • 深入理解Java单例模式:确保类只有一个实例
  • Java-IO流之打印流详解
  • MySQL基础(四)DML、数据表操作DDL操作
  • MAX3490
  • 关于双网卡优先级:有效跃点数的解析(设置值×2)
  • Levenberg-Marquardt算法详解和C++代码示例
  • 代驾数据库
  • Java逻辑运算符常见错误分析与规避指南
  • 使用 Python 和 HuggingFace Transformers 进行对象检测
  • 位运算(Bitwise Operations)深度解析
  • 基于J2EE架构的在线考试系统设计与实现【源码+文档】
  • 机器学习算法时间复杂度解析:为什么它如此重要?
  • C/C++ 中附加包含目录、附加库目录与附加依赖项详解
  • 波士顿房价预测(线性回归模型)
  • c++重点知识总结
  • VMware 安装 CentOS8详细教程 (附步骤截图)附连接公网、虚拟机yum源等系统配置
  • SQLAlchemy 中的 func 函数使用指南
  • CVAT标注服务
  • Python训练营---Day46
  • 使用pwm控制舵机来回摆动的中心位置
  • 深入解析JVM工作原理:从字节码到机器指令的全过程
  • Unity | AmplifyShaderEditor插件基础(第五集:简易移动shader)
  • 大模型编程助手-windsurf
  • QT自定义资源管理器
  • 代付业务怎么理解?
  • JDK21 虚拟线程原理剖析与性能深度解析
  • 【网页端数字人开发】基于模型SAiD实现嘴型同步
  • ShaderToy:入门
  • for(;;) 和while(1) 的无限循环用法对比,优缺点说明
  • Python训练营-Day23-Pipeline