JVM基础知识(一)
1.整体架构和组件
1.Class Loader
Class Loader(类加载器)负责将.class文件加载到JVM中,并生成对应的Java类对象(Class对象)。Java中有三种类加载器:
- Bootstram ClassLoader:加载核心类库,使用C++实现,是JVM的一部分;
- Extension ClassLoader:加载Java扩展类库(例如javax.*包),使用Java实现,是sun.misc.Launcher的一部分;
- App ClassLoader:加载应用程序类,使用Java实现,是ClassLoader的子类。
.2.Execution Engine
Execution Engine(执行引擎)负责解释字节码,将其转换为机器指令,并执行程序。JVM的执行引擎包括两种模式:
- 解释器模式(Interpretive Mode):逐行解释字节码,并执行相应的机器指令。这种模式的优点是可以快速启动,但是执行速度较慢。
- 编译器模式(Compiler Mode):将字节码编译为本地机器指令,并执行编译后的代码。这种模式的优点是执行速度快,但是启动速度慢。
JVM采用了混合模式(Mixed Mode),在程序运行的过程中根据需要动态地选择使用解释器模式或编译器模式。
3.Runtime Data Area
Runtime Data Area(运行时数据区)是JVM中的数据存储区域,包括以下组件:
- Method Area(方法区):存储类信息、常量、静态变量等数据。
- Heap(堆):存储Java对象和数组。
- Stack(栈):存储Java方法的局部变量、操作数栈、方法出口等信息。
- PC Register(程序计数器):存储正在执行的Java方法的地址。
- Native Method Stack(本地方法栈):为Java调用本地方法提供支持。
4.Native Method Interface
Native Method Interface(本地方法接口)允许Java代码调用C或C++编写的本地方法。本地方法通过JNI(Java Native Interface)实现。JVM将Java参数转换为C/C++参数,调用本地方法并返回结果。
JVM的整体架构和组件是Java程序运行的基础,对于Java程序员来说,了解JVM的原理和内部机制可以帮助他们写出更高效、更稳定的Java程序。
2.组件间交互方式
2.1Class Loader和Method Area
当一个Java类第一次被加载时,Class Loader会将类的.class文件读入内存,并在Method Area中创建对应的Class对象,包括类的成员变量、方法等信息。在JVM运行期间,所有的类信息都保存在Method Area中,包括类的字节码、运行时常量池、字段和方法信息等。
2.2Heap和Stack
在Java程序中,创建对象时,它们的实例数据存储在Heap中,而对象的引用则存储在Stack中。每个Java方法都会创建一个栈帧(Stack Frame),存储该方法的局部变量、操作数栈、方法出口等信息,栈帧也存储在Stack中。
当一个Java方法被调用时,JVM会在Stack中创建一个新的栈帧,并将该栈帧推入栈顶。当方法执行完成后,JVM会弹出该栈帧,并回收其内存空间。
2.3Execution Engine和Method Area
Execution Engine负责执行Java字节码,并将其转换为计算机能够执行的机器指令。在执行字节码之前,Execution Engine需要在Method Area中查找字节码、常量等信息,并将其载入运行时常量池中。
2.4Native Method Interface和Native Method Stack
当Java程序需要调用C/C++编写的本地方法时,JVM会将Java参数转换为C/C++参数,并调用本地方法。本地方法的结果会被返回给Java程序,并且需要将C/C++结果转换为Java结果。
Native Method Interface提供了一种机制,可以在Java程序中调用C/C++编写的本地方法,使Java程序能够与底层系统交互。
3.类加载器的工作原理和类加载的过程
类加载器(ClassLoader)是JVM的一个重要组成部分,它负责将Java类从磁盘或网络等外部存储器中加载到JVM的内存中。类加载器采用的是“双亲委派模型”,即当一个类需要被加载时,它首先会委托它的父类加载器寻找该类,直到最终委托到启动类加载器为止。如果所有的父类加载器都无法找到该类,则由该类加载器自行加载。
类加载的过程通常包括以下三个阶段:
-
加载(Loading):查找并加载类的二进制数据。类加载器首先会通过类的全限定名找到对应的.class文件,然后将二进制数据读入内存,并在内存中创建对应的Class对象。需要注意的是,同一个类在JVM中只会被加载一次。
-
连接(Linking):将类的二进制数据合并到JVM的运行时环境中。连接阶段包括三个步骤:
- 验证(Verification):确保类的二进制数据符合JVM规范,并且没有安全漏洞。
- 准备(Preparation):为类的静态变量分配内存,并设置默认值。
- 解析(Resolution):将符号引用替换为直接引用,即将类、字段、方法等引用转换为内存地址。
- 初始化(Initialization):为类的静态变量赋初值,并执行类的静态代码块。在JVM中,类的初始化是一个线程安全的操作,保证了类只会被初始化一次。如果该类还有父类,那么会先初始化父类。
需要注意的是,JVM只有在需要用到某个类时才会进行类的加载和初始化,这种机制被称为“延迟加载”。同时,JVM还支持动态类加载机制,可以在程序运行期间通过Java反射机制加载新的类,并将其加入到JVM中。
4.字节码指令集的基本语法和用法
Java代码在经过编译器编译后,会被转换成字节码(Bytecode),也就是一种跨平台的中间代码。字节码指令集是Java虚拟机(JVM)可以识别并执行的代码格式。字节码指令集具有简洁、紧凑的特点,并且与底层的硬件架构无关,因此可以在不同的平台上运行。
字节码指令集由单个字节的指令组成,每个指令都有一个操作码(Opcode)和一个或多个操作数。Java虚拟机通过执行一系列的字节码指令来完成Java程序的运行。
下面是字节码指令集的一些基本语法和用法:
4.1加载和存储指令
- 从局部变量表加载值到操作数栈:iload, dload, aload, etc.
- 从操作数栈存储值到局部变量表:istore, dstore, astore, etc.
4.2运算指令
- 二进制运算指令:iadd, dadd, isub, dsub, imul, dmul, idiv, ddiv, irem, drem, etc.
- 位运算指令:ishl, ishr, iushr, iand, ior, ixor, etc.
4.3类型转换指令
- 将整型值转换为其他类型:i2d, i2l, i2f, etc.
- 将浮点型值转换为其他类型:d2i, d2l, d2f, etc.
- 将长整型值转换为其他类型:l2i, l2d, l2f, etc.
4.4控制指令
- 条件跳转指令:ifeq, ifne, iflt, ifgt, ifle, ifge, etc.
- 无条件跳转指令:goto, goto_w, etc.
- 返回指令:ireturn, dreturn, areturn, etc.
4.5对象操作指令
- 创建新对象指令:new, newarray, anewarray, etc.
- 字段操作指令:getfield, putfield, getstatic, putstatic, etc.
- 方法调用指令:invokevirtual, invokespecial, invokestatic, invokeinterface, etc.
总的来说,字节码指令集提供了Java虚拟机执行Java程序的基本语法和用法,同时也是Java程序跨平台运行的重要保障之一。
5.JIT编译器和AOT编译器
JIT编译器和AOT编译器都是将代码转换为机器码的工具,但它们的工作方式和优缺点存在较大差异。
JIT编译器(Just-In-Time Compiler)在程序运行过程中,将字节码实时编译为本地机器码执行。JIT编译器可以根据程序的实际运行情况,对热点代码进行优化,提高程序的执行效率。JIT编译器的优点包括:
- 即时编译,避免了预编译导致的启动时间过长问题;
- 动态编译,可以根据程序的实际运行情况进行优化,提高程序的执行效率;
- 与Java虚拟机紧密结合,提高了程序的可移植性和兼容性。
JIT编译器的缺点包括:
- 编译时间较长,可能会影响程序的响应时间;
- 对于一些只执行一次的代码,JIT编译器不会进行优化,浪费了一些性能资源;
- JIT编译器会占用较多的内存空间。
AOT编译器(Ahead-Of-Time Compiler)在程序运行前,将Java字节码编译为本地机器码,生成可执行文件。AOT编译器可以通过静态编译的方式,对整个程序进行优化,提高程序的执行效率。AOT编译器的优点包括:
- 编译时间较短,启动时间较短;
- 可以进行全局优化,对整个程序进行优化,提高程序的执行效率;
- 可以在没有Java虚拟机的环境下运行程序。
AOT编译器的缺点包括:
- 缺乏动态优化,对于程序的实际运行情况无法进行优化;
- 可能导致可移植性和兼容性问题;
- 占用磁盘空间较大,难以适用于资源受限的环境。
综上所述,JIT编译器和AOT编译器在实现方式和优缺点上存在差异,各自适用于不同的场景。在Java虚拟机中,JIT编译器是主流的编译器,可以提供动态优化和更好的可移植性;而AOT编译器则更适用于一些特定场景,如嵌入式系统或移动端应用。
相关文章:
JVM基础知识(一)
1.整体架构和组件 1.Class Loader Class Loader(类加载器)负责将.class文件加载到JVM中,并生成对应的Java类对象(Class对象)。Java中有三种类加载器: Bootstram ClassLoader:加载核心类库&…...
ASP.NET Core Web API用户身份验证
一、JWT介绍 ASP.NET Core Web API用户身份验证的方法有很多,本文只介绍JWT方法。JWT实现了服务端无状态,在分布式服务、会话一致性、单点登录等方面凸显优势,不占用服务端资源。简单来说,JWT的验证过程如下所示: &a…...
785. 快速排序
785. 快速排序 给定你一个长度为 n n n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n n n。 第二行包含 n n n 个整数(所有整数均在 1 ∼ 1 0 9 1 \th…...
C6678学习-IPC
文章目录 1、简介2、模块MultiProc静态设置(cfg设置)动态设置 IPCNotifyMessageQShareRegion 1、简介 IPC: Inter-Processor Communication 处理器间通信,指提供多处理器环境中的处理器之间的通信、相同处理器不同线程间的通信。包括数据传递…...
利用 Delte-Sigma ADC简化电路设计
很多时候在电路中选择合适的 ADC可以很大程度上简化前端的电路。这里我们一起来看一个电阻电桥的例子: 这里用到了一只仪表放大器和一只运算放大器,他们实际上主要完成了三个功能: 1. 抑制了 2.5V的共模信号; 2. 将-1…...
如何在 Windows 11 启用 Hyper-V
准备在本机玩一下k8s,需要先启用 Hyper-V,谁知道这一打开,没有 Hyper-V选项: 1、查看功能截图: 2、以下文件保存记事本,然后重命名为*.bat pushd "%~dp0" dir /b %SystemRoot%\servicing\Packa…...
哈希表企业应用-DNA的字符串检测
DNA的字符串检测-引言 若干年后, ikun DNA 检测部成立,专门对 这些ikun的解析检测 突然发现已经完全控制不了 因为学生已经会了 而且是太会了 所以DNA采用 以下视频测试: ikun必进曲 ikun必经曲 ikun必阶曲 如何感受到了吧!,如果你现在唱跳并且还Rap 还有打篮球 还有铁山靠 那…...
Kafka运维与监控
Kafka运维与监控 Kafka运维与监控一、简介二、运维1.安装和部署安装部署 2.优化参数配置配置文件高级配置分区和副本设置分区数量设置副本数量设置 网络参数调优传输机制设置连接数和缓冲区大小设置 消息压缩和传输设置消息压缩设置消息传输设置 磁盘设置和文件系统分区磁盘容量…...
【Redis—哨兵机制】
文章目录 概念哨兵机制如何工作的监控(如何判断主节点真的故障了)哪个哨兵进行主从故障转移?故障转移流程哨兵集群 概念 当进行主从复制时,如果主节点挂掉了,那么没有主节点来服务客户端的写操作请求了,也…...
MySQL学习笔记第七天
第07章单行函数 2. 数值函数 2.4 指数函数、对数函数 函数用法POW(x,y),POWER(X,Y)返回x的y次方EXP(X)返回e的x次方,其中e是一个常数,2.718281828459045LN(X),LOG(X)返回以e为底的X的对数,当x<0时,返…...
中级软件设计师备考---程序设计语言和法律法规知识
目录 需要掌握的程序语言特点法律法规知识---保护期限法律法规知识---知识产权人确定法律法规知识---侵权判定标准化基础知识 需要掌握的程序语言特点 Fortran语言:科学计算、执行效率高Pascal语言:为教学而开发的、表达能力强,演化出了Delp…...
Leetcode434. 字符串中的单词数
Every day a leetcode 题目来源:434. 字符串中的单词数 解法1:istringstream 我们知道,C默认通过空格(或回车)来分割字符串输入,即区分不同的字符串输入。 istringstream类用于执行C风格的串流的输入操…...
C++ cmake工程引入qt6和Quick 教程
目录标题 前言QML简介锻炼C水平 cmake修改方法方式一(qt6_add_resources)方式二 (qt_add_qml_module ) 其他相关知识为什么会有_other_files?qt_standard_project_setup() 函数qt_add_qml_module() 和 qt6_add_resources()的方式差异const QU…...
JavaEE - 网络编程
一、网络编程基础 为什么需要网络编程? 用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。 与本地打开视频文件类似,只是视频文件这个资源的来源是网络。 相比本…...
【Android车载系列】第11章 系统服务-SystemServer自定义服务
1 编写自定义系统服务 1.1 AIDL接口定义 系统源码目录/frameworks/base/core/java/android/app/下新建AIDL接口IYvanManager.aidl package android.app;/** * 目录:/frameworks/base/core/java/android/app/IYvanManager.aidl */ interface IYvanManager{String …...
Lerna
Lerna Lerna是一个优化基于gitnpm的多pagkage项目的管理工具 解决的痛点 痛点一:重复操作 多Package本地link多Package依赖安装多Package单元测试多Package代码提交多Package代码发布 痛点二:版本一致性 发布时版本一 致性发布后相互依赖版本升级 package越多,管…...
迁移学习 pytorch
迁移学习(Transfer Learning)是通过使用一个预训练模型来快速训练一个新的网络模型,通常应用于数据集较小或计算资源较少的情况下。在 PyTorch 中,由于 torchvision 库中已经内置了一些经典的预训练模型,因此我们可以通过简单的调用函数来实现迁移学习。 下面是一个基于 …...
【python】keras包:深度学习( RNN循环神经网络 Recurrent Neural Networks)
RNN循环神经网络 应用: 物体移动位置预测、股价预测、序列文本生成、语言翻译、从语句中自动识别人名、 问题总结 这类问题,都需要通过历史数据,对未来数据进行预判 序列模型 两大特点 输入(输出)元素具有顺序关系…...
vue框架快速入门
vue 1、第一个Vue程序1.1、什么是Vue程序1.2、为什么要使用MVVM1.3、Vue1.4、第一个vue程序 2、基础语法2.1、v-bind2.2、v-if, v-else2.3、v-for2.4、v-on 3、Vue表单双绑、组件3.1、什么是双向数据绑定3.2、在表单中使用双向数据绑定3.3、什么是组件 4、Axios异步…...
Java连接顺丰开放平台
今天使用Java去访问顺丰的开放平台时,JSON转换一直不成功,最终发现是 可以看到这里是 "apiResultData": "{\"success\": .........它是以 " 开头的!!!如果是对象的话,那么…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
