小研究 - Java 虚拟机实现原理分析

news2024/11/17 19:44:21

针对虚拟机的底层实现原理及相关实现过程,讨论了 Java 语言的跨平台原理以及相关工作机制,分析了 JVM 底层各数据区内存管理过程,阐述了 JVM 在 Java 语言中的核心作用以及重要地位。

       目录

1 概述

2 Java 平台分层原理

3 虚拟机工作原理

4 虚拟机内存管理

 5 类加载机制

6 结束语


1 概述

Java 语言的闪耀点是其跨平台特性,使其征服了网络编程界,而 Java 虚拟机以其独特的作用及强大的功能支撑 起Java平台的强大地位,Java虚拟机是连接应用程序与系 统平台及机器硬件的桥梁,是Java语言的核心基石。

2 Java 平台分层原理

1995 年 SUM 公司正式对外发布了第一个版本的 JDK 后,在编程界引起了极大的反响,随后几年风靡编程领域,从此之后各类面向对象跨平台编程犹如雨后春笋般的出现。把源文件转换成字节码文件,是Java语言的重要特征及显耀的光芒,为何其具有如此强 大的能力,归根到底就是因为虚拟机的重要作用。Java虚 拟机在计算机编程领域又称之为JVM,是一种用代码语句来模拟计算机元件功能的实现包。 大家都清楚,Java语言即不是一种完全解释型的语言,也不是一种完全编译型的语言,其源码文件会在编译命令的执行过程中转成字节码文件,由于字节码文件不是可执行文件,因而其不能直接被操作系统调用执行。字节码是一种字节流文件,其以 class 类型的文件存在,是一种跟平台不相耦合的类型文件,需要经过 JVM 的翻译转换才能被硬件环境识别。Java 平台体系结构可分为四层:最上面的为 Java 应用程序层;在此层的下面是 API 接口层,此层包含了众多的JDK核心类库;再往下一层就是JVM位置所在,JVM在此层完成字节码解释转换工作,JVM 层与 API 层共同构成 Java 语言的运行时环境(JRE);最下面一 层为机器硬件平台层,此层直接执行由 JVM 解释出来的二进制命令。

3 虚拟机工作原理

Java 虚拟机是操作系统中的一个 job,所有 Java 应用 程序均归属某一个虚拟机实例,当运行作为 Java 程序起点 的 Main 方法时,JVM便被创建。JVM便被创建后,在虚拟机job运行过程中会创建守护线程,守护线程的作用是监测非守护线程的执行过程,保障程序的完整执行,直到应用程序的退出。Java 虚拟机是连接应用与操作平台的桥梁,从字节码文件变成可执行的机器命令,JVM 的工作过程包含七个步骤,分别是:字节码装载、字节流校验、静态变量初始化、引用转换、对象实例化、反射调用、GC 回收,如表 1 所示。

第一步,装载 class 类型文件到内存中。本阶段的目标是要对数据进行初始化处理,衔接后继步骤,完成整个JVM工作过程的第一步。在这一阶段所要实现的具体内容是要通过类名来定位并导入相关的字节流,并生成一个与此类相关联的类型对象,作为该类的操作入口。

第二步,进行类的链接操作。在这一阶段主要负责将 二进制字节流的数据装入JRE环境,此阶段包含三个过 程:字节流校验、静态变量分配内存空间、引用转换。 验证过程完成对源码类的检查,以维护JVM自身的安全;准备过程完成源码类型结构的初始化;解析过程直接 对常量值初始化。

第三步,进行Java类的对象实例化过程。此步是加载 过程最后一步,在此阶段所要完成的任务是:执行超类、子类中各种静态语句块,按顺序执行父类、子类的构造器函数完成实例化过程。

第四步,运行Java类的相关功能。在此阶段类的功能 可以被机器以指令的方式执行。

第五步,卸载运行完毕的类对象。经过垃圾回收机制(GC)处理的最终会被JVM从内存中卸载。

4 虚拟机内存管理

虚拟机运行时会将正在使用的内存空间划分为不同的区域,每个区域负责不同的功能,各个区域的创建,销毁过程也都不相同。总的来说,JVM内存空间划分为两大块, 数据共享区与私有区,每大块又可以进一步细分,如表 2。

全局变量区:用于存储源码类中的全局变量,为各个线程的内存数据共享区域。

实例区:存放用new关键字定义并经过初始化的实例,此区空间会被GC释放,同为数据共享区。

局部变量区:用于存储源码类中的局部变量,数据为特定线程专用。局部变量周期与实例线程相同,为数据私有区,不可共享。

本地方法区:与局部变量区类似,只为本地局部 Native 方法使用,部分 JVM 中也会将其与虚拟机栈合并为一,同为数据私有区,不可共享。

字节码指令区:存储实例线程下一步所要执行的计算机指令,同为数据私有区,不可共享。

 5 类加载机制

在JRE环境中,有多个层级的类加载器,如表3所示。最顶层的为:JDK根类加载器(Bootstrap),此类为所有类加在载器的总父类,次级类加载器(Extension)为其子类,直接继承了此父加载器,次级加载器类下面同样也存在一个继承子类,三级类加载器(Application),在此子类中开放了自定义接口,自用户可根据实际需要编码以实现自定义加载器的开发。

同时在 JRE 环境中,加载器的装载过程采用的是向上 传递装载的实现方式,当加载器收到请求要进行类装载 时,其会把相关请求发送给其直接父类,父加载器同样会 把请求向上递归传递,直到最顶层加载器。当最顶层的加 载器无法完成装载任务时,才会把请求交由子类完成,这就保证了在任务场景下类的加载任务均由最高的类加载 器完成,保证了所有类型的实例对象具有相同的一致性, 以避免应用程序的混乱。

6 结束语

虚拟机并不是真正的机器,是一种通过代码来实现硬 件功能的插件包。虚拟机有自己的模拟硬件环境,如全局及局部变量区、本地方法区、字节码区、实例区等,还有自己的指令系统。对Java 语言跨平台特性而言,虚拟机是其 核心构件,其直接关系应用程序的完整、健康执行,是 Java 语言的中枢组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/814237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDC一键入湖:当 Apache Hudi DeltaStreamer 遇见 Serverless Spark

文章目录 1. 整体架构2. 环境准备3. 配置全局变量4. 创建专属工作目录和存储桶5. 创建 EMR Serverless Execution Role6. 创建 EMR Serverless Application7. 提交 Apache Hudi DeltaStreamer CDC 作业7.1 准备作业描述文件7.2 提交作业7.3 监控作业7.4 错误检索7.5 停止作业 8…

仿转转闲鱼链接后台生成

教程:修改数据库账号密码直接使用。 源码带有教程! 下载程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法 如下图所示,打开TIA博途,新建一个项目,添加一个PLC UDT数据类型Iomap,数据类型为Array[0…49] of Byte, 如下图所示,再添加一个全局DB块,在DB块中添加一个变量map,数据类型为Iomap, 如下图所示,在PLC变量表中添加一…

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 在之前的开发中,遇到了实时音视频呼叫通知,当App未打开或者App在后台时候,需要通知到用户,用户点击通知栏后是否接入实时音视频的视频或者音频通话。 在…

【微服务】springboot整合mongodb使用详解

目录 一、mongodb简介 1.1 什么是mongodb 1.2 mongodb特点 二、mongodb中的核心术语 2.1 mogodb与数据库对比 2.2 mongodb中的核心概念 2.3 与关系数据库的差异 2.3.1 半结构化 2.3.2 支持多级嵌套 2.3.3 关系弱化 三、mongodb 技术优势和应用场景 3.1 mongodb 技术…

redis主从复制哨兵Cluster

目录 前言 一、模式介绍 1.1 主从复制 1.2 哨兵 1.3 集群 二、主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis 主从复制 三、Redis 哨兵模式 3.1 哨兵模式原理 3.2 哨兵模式的作用 3.3 哨兵组成结构 3.4 哨兵故障转移机制 3.5 搭建Redis 哨兵模式…

利用频谱仪进行简单的2.4G 频率测试

一、概述 1. 信号源 我们开发2.4G 无线产品的时候,经常需要对产品的无线信号进行测试,以确定精确的频率。在进行频率测试之前,我们的2.4G 射频芯片需要进入单载波模式。 2. 频谱仪 这里选择的是普源的频谱仪。测试范围是 9kHz - 3.2GHz。…

【工具篇】Lombok 介绍及使用(详细教程)

Lombok 介绍及使用 一,Lombok介绍 在 Java 开发中,常常需要编写大量的getter、setter方法、equals和hashCode方法、构造函数等重复且繁琐的代码。 为了减少 Java 代码中的冗余和样板代码,提高代码的可读性和开发效率,就有了Lomb…

数据结构: 线性表(无哨兵位单链表实现)

文章目录 1. 线性表的链式表示: 链表1.1 顺序表的优缺点1.2 链表的概念1.3 链表的优缺点1.4 链表的结构 2. 单链表的定义2.1 单链表的结构体2.2 接口函数 3. 接口函数的实现3.1 动态申请一个结点 (BuySListNode)3.2 单链表打印 (SListPrint)3.3 单链表尾插 (SListPushBack)3.4 …

【雕爷学编程】MicroPython动手做(20)——掌控板之三轴加速度6

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

【LangChain】向量存储(Vector stores)

概要 存储和搜索非结构化数据的最常见方法之一是嵌入它并存储生成的嵌入向量,然后在查询时嵌入非结构化查询并检索与嵌入查询“最相似”的嵌入向量。向量存储负责存储嵌入数据并为您执行向量搜索。 内容 本篇讲述与 VectorStore 相关的基本功能。使用向量存储的一…

【Git】远程仓库的创建、SSH协议克隆、拉取、推送

目录 一、创建远程仓库 二、HTTPS协议克隆仓库 三、SSH协议克隆仓库 四、向远程仓库推送 五、从远程仓库拉取 六、忽略特殊文件 七、配置命令别名 一、创建远程仓库 首先我们可以从GitHub或者Gitee中创建自己的个人仓库 工作台 - Gitee.comhttps://gitee.com/ 二、HTT…

Sestra 实用教程(三)输入与输出

目 录 一、前言二、分析流程三、输入文件3.1 模型与荷载3.2 分析控制数据 四、输出文件五、参考文献 一、前言 SESAM (Super Element Structure Analysis Module)是由挪威船级社(DNV-GL)开发的一款有限元分析(FEA&…

关于在VS2017中编译Qt项目遇到的问题

关于在VS2017中编译Qt项目遇到的问题 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。如何在VS2017里部署的Qt Designer上编辑槽函数 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。 链接 如何在VS2017里部署的Qt Design…

【LeetCode】解码方法

这里写目录标题 题目描述算法流程编程代码代码优化 链接: 解码方法 题目描述 算法流程 编程代码 class Solution { public:int numDecodings(string s) {int n s.size();vector<int> dp(n);dp[0] s[0] ! 0;if(n 1) return dp[0];if(s[1] < 9 && s[1] >…

python之编写form表单提交到后端

一、环境配置 我们先去python的框架中下载Flask&#xff0c;具体的配置我给大家找了一篇博客讲解&#xff0c;环境调试没问题后&#xff0c;开始我们form表单提交的过程 Python之flask框架_python flask_【网络星空】的博客-CSDN博客 二、前端代码 在VScode里编写前端的代码为…

移动端加入购物车界面设计

效果图 源码如下 页面设计 <template><div class"container"><!--商品详情 start--><van-image class"goods-item-image" :src"goods.goodsHeadImg"></van-image><div class"goods-price">&…

【安装vue脚手架报错:npm install -g @vue-cli pm ERR! code EINVALIDTAGNAME 】

当我们执行npm install -g vue-cli时候会报错&#xff1a; npm ERR! Invalid tag name “vue-cli” of package “vue-cli”: Tags may not have any characters that encodeURIComponent encodes. npm ERR! A complete log of this run can be found in: /Users/wuwenlu/.npm/…

【MySQL】MySQL索引、事务、用户管理

20岁的男生穷困潦倒&#xff0c;20岁的女生风华正茂&#xff0c;没有人会一直风华正茂&#xff0c;也没有人会一直穷困潦倒… 文章目录 一、MySQL索引特性&#xff08;重点&#xff09;1.磁盘、OS、MySQL&#xff0c;在进行数据IO时三者的关系2.索引的理解3.聚簇索引&#xff0…

仿找靓机链接生成 独立后台管理

教程&#xff1a;修改数据库账号密码直接使用。 源码带有教程! 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3