一、记一次JVM预入门探讨(笔记)

本文从编程语言的发展历程出发,介绍了Java语言及其虚拟机(JVM)的工作原理。包括Java如何通过中间语言实现跨平台兼容,JVM如何将字节码指令转化为机器码并执行等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

致敬“Java之父”—詹姆斯·高斯林

第一次研究JVM所带入的问题:

何为Java NIO?
何为VMA?
何为内核映射?

发展:

1)机器码难以阅读、理解和排错,诞生了助记符,然后用助记符号来进行编程,编完以后大脑执行一遍以后确保没问题以后再将助记符转换成机器码,制作成孔带
2)二战还没结束期间,时势造英雄。Grace Hopper作为一位大牛,仍然觉得这样很麻烦,于是就开发了A-0 System,其能够自动将助记符转换成机器码。
3)当时的助记符就是所谓的汇编


机器生汇编,汇编生B,B生C,C生万物
一生二,二生三,三生万物

编程语言兼容底层系统的方式有两种:

1、通过编译器实现兼容

C、C++是通过特定的编译器编译成相应的平台的机器指令,但是编译器实现兼容时,如果涉及到系统的调用,往往都需要需改程序,调用特定系统的API,否则迁移到新平台之后无法运行。

2、通过中间语言实现兼容

Java、C#等语言,都属于这种兼容方式。
Java/C#文件先被编译生成中间语言(ML),中间语言指令由虚拟机进行解析和运行。无论身于哪种平台,生成的中间语指令都是相同,中间语的兼容性是由虚拟机负责完成的。
如今的Java性能相当的高,甚至比C/C++程序性能还要高。这是因为Java虚拟机内部对寄存器进行了大量手工优化,在某些场景下,人工优化自然会比C/C++编译器所做的机器优化效果要好很多。


A、中间语言翻译

CPU看不懂中间语言,无法直接执行中间语言,虚拟机必须将中间语解析翻译成对应的机器上的机器指令。
引出的课题:怎样将中间语言翻译成对应的机器指令并且得以执行。
课题中的两个问题:
1)怎么把中间语言翻译成对应的机器指令
2)翻译完后怎么执行程序?


科普君:Java的中间语—-字节码指令


1、字节码指令翻译到对应的机器码的一种可行办法:
通过C程序,将字节码的每一条指令都逐行解释成C程序。当执行字节码的程序——JVM程序本身被编译后,字节码指令所对应的C程序被一起编译成本地机器码,于是虚拟机在解释字节码指令时,自然就会执行对应的C程序所对应的本地机器码。意思就是,JVM已经被编译成机器码,字节码被解释成C语言后马上也被编译成机器码,就是大家现在都是机器码了,JVM在解释字节码的时候顺便也执行对应C程序对应的本地机器码。

2、通过C程序进行翻译
栗子,发明某种中间语,实现两个正整数相加,这条指令的助记符为iadd,对应的数字唯一编号是0x01

//虚拟解释器
int add(int a, int b, int code){
        if(code == 0x01){
                return a+b;
    }
    return -1;
}

add()看作为执行引擎,执行引擎接收操作数和指令编码,判断指令编码是否iadd,如果是iadd指令便对两个入栈的操作参数执行加法运算,并返回结果。(第一代JVM的执行引擎)

3、直接翻译为机器码
CPU执行一段代码只需要将CS:IP段寄存器指向代码段的入口处即可。
CS与IP是物理CPU内部的两个寄存器,也是一台物理机器最重要的寄存器,因为CPU在取指令时是完全依靠这两个寄存器的。CS寄存器保存段地址,IP保存偏移地址。
CS和IP这两个寄存器的值能够唯一确定内存中的一个地址。
函数跳转的本质就是修改CS和IP着两个寄存器的内容。
修改CS:IP段寄存器可以使用汇编直接修改,也可以在高级语言中通过语法糖(语法规则)的形式修改。
语法规则只存在于语言中,到了机器码层面就已经没有语法规则了,只有0和1。

使用C程序提供的语法糖修改CS:IP段寄存器的指向:

#include <stdio.h>
int run(int a, int b);

int main(int argc, char* argv[])
{
    int a = 10;
    int b = 11;

    int (*func)(int,int);//定义函数指针
    func = *run;//初始化函数指针,使其指向int run(int,int)函数入口
    int r = func(a, b);//执行函数
    printf("r=%d\n",r);

    return 0;
}

int run(int a,int b) {
    return a + b;
}
标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了个基于灰狼优化算法(GWO)优化的卷积双向长短期忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列测项目。该项目旨在解决传统时序测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准测。项目不仅涵盖了数据处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备定编程基础,特别是对深度学习、时间序列测及优化算法有定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷测、金融市场多资产价格测、环境气象多参数报、智能制造设备状态监测与测维护、交通流量测与智慧交通管理、医疗健康多指标测等领域;②提升多变量多步时间序列测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据处理的重要性,合理设置模型参数与网络结构,控制多步测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值