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 右上角菜单 > 更多工具 > 开发者工具 页面…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
