Java虚拟机:JVM介绍
1024 程序员节日快乐!愿您我的代码永远没有 bug ,人生永远没有 bug !
JVM
- 概述
- JVM 架构
概述
JVM( Java Virtual Machine ,Java 虚拟机),是 Java 语言的运行环境,是运行所有 Java 程序的抽象计算机(一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现)。JVM 的主要功能是执行 Java 字节码,JVM 是 Java 程序的中间表示形式,是 Java 程序从源代码到实际运行的中间桥梁。Java 编译器将 Java 源代码编译成字节码后,JVM 将这些字节码解释或编译成特定平台上的机器指令并执行,而无需针对每个平台重新编写和编译源代码。
JVM 具有一套完整的硬件架构,包括处理器、堆栈、寄存器等,以及相应的指令系统。这使得 JVM 能够模拟实际计算机的各种功能,从而在不同的操作系统和硬件平台上实现 Java 程序的运行。这种特性使得 Java 语言具有跨平台性。
JVM 还负责管理 Java 程序的内存,包括堆内存和栈内存的分配、回收和释放。其使用垃圾回收机制来自动管理内存,从而减轻了开发者的负担。此外,JVM 还支持多线程并发执行,可以创建和管理多个线程,实现并发编程。同时,还提供了安全管理机制,对 Java 程序的访问权限进行控制,保护系统的安全性。
在实际开发中,JVM 的应用广泛,如 Tomcat 、Jetty 等 Web 服务器都使用 JVM 来运行 Java Web 应用程序。同时,JVM 的特性和机制也在许多常用功能和程序实现中发挥着基础作用。
JVM 架构
一、类加载子系统:
负责在运行时动态加载 Java 类。其主要功能是将类的 .class 文件中的二进制数据读入到内存中,并将其放置在运行时数据区的方法区内。然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构。这个 Class 对象就是类加载的最终产品,其向 Java 程序员提供了访问方法区内的数据结构的接口。
类加载的过程包括加载、验证、准备、解析和初始化五个阶段。加载阶段主要是将类的二进制数据读入内存;验证阶段确保 .class 文件的正确性和安全性;准备阶段为类的静态变量分配内存并设置初始值;解析阶段主要处理符号引用到直接引用的转换;初始化阶段主要是执行类构造器 < clinit >() 方法的过程。
在类加载的过程中,类加载器起到了关键的作用。类加载器负责查找和加载类的二进制数据。在 JVM 中,有多种类加载器,它们之间通常存在包含关系,遵循双亲委派机制(即一个类加载器在加载类时,会首先委托其父类加载器去加载,只有在父类加载器无法加载该类时,才会自己尝试加载)。
二、运行时数据区(内存模型)
负责为程序运行时提供必要的数据存储和操作空间,确保程序能够正确、高效地执行。JVM 在执行 Java 程序时划分的多个不同的数据区域,这些区域各自有着特定的功能与作用。同时,这些区域共同协作,为 Java 程序的执行提供了必要的内存环境。JVM 通过内存管理和垃圾回收机制来确保这些区域的有效利用和安全性。
- 方法区( Method Area ):这是一个线程共享的区域,用于存储类信息、常量、静态变量等数据。在 JDK 8 之前,方法区也被称为永久代( PermGen ),而在 JDK 8 及以后版本中,元数据区( Metaspace )取代了永久代
- 堆( Heap ):这是 JVM 中最大的一块内存区域,主要功能是存放 Java 对象实例和数组。堆区是线程共享的,所有的对象实例以及数组都要在堆上分配。堆内存还可以按照垃圾分代收集的角度划分为年轻代和老年代,年轻代又进一步细分为 Eden 区、From Survivor 区和 To Survivor 区
- 虚拟机栈( Virtual Machine Stack ):每个线程在创建时都会创建一个虚拟机栈,用于存储方法的局部变量和部分结果。虚拟机栈由一个个栈帧组成,每个栈帧对应着一次方法调用
- 程序计算器( Program Counter Register ):这是一个线程私有的内存区域,用于存储当前线程正在执行的 Java 方法的指令地址。由于 Java 是支持多线程的语言,每个线程需要有独立的程序计数器来记录当前线程执行的位置
- 本地地方栈( Native Method Stack ):用于支持 native 方法的执行。与虚拟机栈类似,但是为 native 方法服务的
三、执行引擎
负责将编译后的字节码解释成可执行的机器指令,从而实现了 Java 程序的运行。其主要功能是将 Java 字节码转换为特定平台上的本地机器指令,以便操作系统能够识别和执行。
执行引擎主要包括解释执行和即时编译两种方式。解释执行是 JVM 启动时根据语法规范对字节码逐行解释执行,将每行字节码文件的内容翻译成本地平台的机器指令。这种方式性能较低,但具有跨平台的优势。而即时编译是可以将频繁执行的代码优化为本地机器码,提高执行效率。
在执行过程中,执行引擎从程序计算器中获取要执行的指令索引,使用指令索引从操作数栈中获取要执行的指令,然后将指令转换为具体的机器指令交给操作系统执行。执行引擎的输入是二进制流,处理过程是将字节码转换为机器指令的过程,输出的是执行结果。
四、本地方法接口
其主要用于实现 Java 代码与本地( Native )代码(如 C 、C++ 代码)之间的交互。本地方法接口允许 Java 程序调用本地方法,从而实现与底层本地代码的交互。这些本地方法在 Java 虚拟机中不会有实现,而是在本地代码中实现。
本地方法接口提供了一系列函数,用于 Java 代码和本地代码之间的数据传递、对象操作、异常处理等。常用的 JNI 函数包括获取类、方法和字段的 ID ,如 FindClass() 、GetMethodID() 、GetFieldID() 等;调用 Java 方法,如 CallVoidMethod() 、CallObjectMethod() 、CallStaticVoidMethod() 等;以及访问和操作 Java 对象,如 NewObject() 、GetObjectField() 、SetObjectField() 等。
本地方法接口在 Java 平台上实现了 Java 与本地代码之间的桥梁,极大地扩展了 Java 的应用范围。JVM 通过调用本地方法栈上的本地方法来执行本地接口的功能。本地接口的作用是融合不同的编程语言为 Java 所用,其初衷是融合 C 或 C++ 程序。在 Java 诞生的时候,为了立足并调用 C 或 C++ 的程序,Java 在内存中开辟了一块区域专门用于处理标记为 native 的代码。具体做法是在本地方法栈中登记 native 方法,在执行引擎执行时加载 native libaries 。
五、本地方法库
本地方法库,指那些包含本地方法实现的库文件。这些本地方法通常是用 C 、C++ 或其他底层语言编写的,并通过本地方法接口(如 JNI 、Java Native Interface )与 Java 代码进行交互。
本地方法库的存在主要是为了扩展 Java 的功能,使其能够调用底层系统函数、访问硬件资源或与其他语言编写的库进行交互。通过本地方法库,Java 程序可以执行一些 Java 本身无法直接完成的操作,从而提高了程序的灵活性和性能。
在 Java 程序中调用本地方法库中的函数时,需要使用本地方法接口。这个接口提供了一组函数,用于在 Java 代码和本地代码之间进行数据传递、对象操作以及异常处理等。通过本地方法接口,Java 程序可以安全地调用本地方法库中的函数,并处理相关的数据交换和异常情况。
需要注意的是,本地方法库的使用需要谨慎处理,以确保程序的稳定性和安全性。由于本地代码直接运行在底层系统上,因此可能存在一些安全风险,如内存泄漏、非法访问等。因此,在编写和使用本地方法时,需要遵循一定的编程规范和最佳实践,以确保程序的正确性和安全性。
总的来说,JVM 架构为 Java 程序的运行提供了强大的支持和保障,使得 Java 程序能够在不同的操作系统和硬件平台上实现跨平台运行。同时,JVM 的调优和性能优化也是确保 Java 程序高效稳定运行的关键。通过优化 JVM 的内存使用、延迟和吞吐量等指标,可以提高程序的性能和响应速度,从而提升用户体验和系统的整体性能。
相关文章:

Java虚拟机:JVM介绍
1024 程序员节日快乐!愿您我的代码永远没有 bug ,人生永远没有 bug ! JVM 概述JVM 架构 概述 JVM( Java Virtual Machine ,Java 虚拟机),是 Java 语言的运行环境,是运行所有 Java 程…...
R数据科学 16.5.3练习题
(1) 编写代码以使用一种映射函数完成以下任务。 a. 计算 mtcars 数据集中每列的均值。 b. 确定 nycflights13::flights 数据集中每列的类型。 c. 计算 iris 数据集中每列唯一值的数量。 d. 分别使用 μ -10、0、10 和 100 的正态分布生成 10 个随机数。 library(purrr) # 计算…...

通过conda install -c nvidia cuda=“11.3.0“ 安装低版本的cuda,但是却安装了高版本的12.4.0
问题 直接通过 conda install -c nvidia cuda"11.3.0"安装得到的却是高版本的 不清楚原理 解决方法 不过我们可以分个安装 runtime toolkit 和 nvcc 安装指定版本的 cudatoolkit 和 nvcc conda install -c nvidia cuda-cudart"11.3.58" conda instal…...

简易CPU设计入门:验证取指令模块
项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后ÿ…...
【MySQL数据库】MySQL主从复制
文章目录 MySQL主从复制MySQL主从复制的分类MySQL主从复制原理MySQL主从复制的配置步骤MySQL主从复制的同步模式 MySQL主从复制实验环境准备关闭防火墙和 SELinux时间同步主服务器设置从服务器设置 MySQL 主从复制配置主服务器配置从服务器配置(以 Slave1 为例&…...

CDC变更数据捕捉技术是什么?和ETL有什么不同?
一、什么是CDC技术? 变更数据捕获(Change Data Capture,简称 CDC)是一种用于识别和跟踪数据源中发生变化的数据的技术。 工作原理: 1.监测数据源:CDC 工具会持续监测指定的数据源,如数据库表、文件系统…...

一种用于推进欧洲临床中心中风管理的联邦学习平台即服务
论文标题:A Federated Learning Platform as a Service for Advancing Stroke Management in European Clinical Centers 作者信息: Diogo Reis Santos, Albert Sund Aillet, Antonio Boiano, Usevalad Milasheuski, Lorenzo Giusti, Marco Di Gennaro…...

给哔哩哔哩bilibili电脑版做个手机遥控器
前言 bilibili电脑版可以在电脑屏幕上观看bilibili视频。然而,电脑版的bilibili不能通过手机控制视频翻页和调节音量,这意味着观看视频时需要一直坐在电脑旁边。那么,有没有办法制作一个手机遥控器来控制bilibili电脑版呢? 首先…...

opencv dnn模块 示例(27) 目标检测 object_detection 之 yolov11
文章目录 1、YOLO v11 介绍1.1、改进点特性1.2、性能对比1.3、多任务支持 2、测试2.1、官方Python测试2.2、Opencv dnn测试2.3、测试统计 3、训练 1、YOLO v11 介绍 YOLO11是Ultralytics实时目标探测器系列中最新的迭代版本,重新定义尖端的精度、速度和效率。在以往…...

鸿蒙开发融云demo初始化和登录
鸿蒙开发融云IMKit初始化和登录 融云鸿蒙版是不带UI的,得自己一步步搭建。 下面说如何初始化和登录: 一、初始化: /*** desc : 初始化融云* author : congge on 2024-07-12 15:47**/public static initRongIm() {IMEngine.getInstance()…...

手机防窥膜的工作原理是怎样的?有必要使用防窥膜吗?
在信息高度发达的社会中,我们通过手机可以实现非常多的操作,同时手机中有存在许多我们的隐私信息,伴随使用手机的时间增多,手机中的信息也有可能被暴露,尤其是在公共场所旁人很容易通过瞥视你的手机屏幕获取到一些信息…...

【Python_PySide6学习笔记(三十九)】基于QLineEdit实现自定义文本框,用于格式化文本,每四个字符后添加一个空格
基于QLineEdit实现自定义文本框,用于格式化文本,每四个字符后添加一个空格 基于QLineEdit实现自定义文本框,用于格式化文本,每四个字符后添加一个空格前言1、实现要点1.1 继承和初始化1.2 定义textChanged的槽函数1.3 格式化逻辑1…...
23种设计模式口诀速记
设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便的复用成功的设计和体系结构 23种设计模式,此处不举例,可以去看我上传的资源里面由详细汇总 口诀: 创建:想见员工丹 [抽象工厂、建造者(生成者…...
n > m 将输出文件 m 和 n 合并。 n < m 将输入文件 m 和 n 合并。 有什么区别
在你的描述中,似乎有一点误解。n >& m 和 n <& m 并不是用来合并文件的,而是用于重定向文件描述符(file descriptors)。让我澄清一下这两个命令的确切含义以及它们之间的区别。 n >& m —— 输出重定向 含…...
语言障碍在自闭症儿童中的表现及应对
自闭症儿童常常面临着语言障碍的困扰,这给他们的成长和发展带来了巨大挑战。 语言障碍在自闭症儿童中的表现形式多样。比如,有个叫小明的自闭症儿童,已经五岁了却还只会说一些简单的词语,如 “爸爸”“妈妈”“要” 等,…...

(成功解决)ubuntu22.04不小心更新成了atzlinux12.7.1,右上角出现红色错误符号
文章目录 🌕问题🌕查看系统版本🌕为什么更新更成了atzlinux🌕通过修复依赖关系尝试解决右上角红色错误符号🌕把源换成ubuntu的源🌕删除atzlinux源和自定义的第三方源🌕重新创建/etc/os-release文…...
005 C#语言基本元素概览,初识类型,变量与方法
构成C#语言的基本元素 标记 :C#编译器可以识别的文本 关键字(Keyword)操作符(Operator)标识符(Identifier)标点符号文本注释和空白 简要介绍数据据类型、变量与方法 变量是存放数据的地方,简称数据 方法是处理数据的逻辑,简称算法 程序…...

Spring Cloud --- Sentinel 授权规则
授权规则概述 在某些场景下,需要根据调用接口的来源判断是否允许执行本次请求。此时就可以使用 Sentinel 提供的授权规则来实现,Sentinel 的授权规则能够根据请求的来源判断是否允许本次请求通过。 在 Sentinel 的授权规则中,提供了 白名单…...

计算机网络基础 - 传输层(1)
计算机网络基础 传输层概述多路复用与解复用概述解复用的工作原理无连接多路解复用面向连接的多路复用 无连接运输:UDP概述UDP 主要应用UDP 报文段结构 可靠数据传输的原理概述构建可靠数据传输协议经完全可靠信道的可靠数据传输:rdt1.0经具有比特差错信…...

Chrome DevTools:Console Performance 汇总篇
Chrome DevTools Chrome 开发者工具是一套 Web 开发者工具,直接内置于 Google Chrome 浏览器中。 开发者工具可以帮助您即时修改页面和快速诊断问题,最终帮助您更快地构建更好的网站。 一、开启 DevTools 右上角菜单 > 更多工具 > 开发者工具 页面…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...