如何让java代码保存一天内的记录_Java的JVM解读

1、 什么是JVM

JVM的全称是Java Virtual Machine(Java虚拟机),它通过模拟一个计算机来达到计算机所具有的计算功能。

2、 JVM体系结构详解

JVM的结构基本上由四部分组成:

----类加载器(ClassLoader):在JVM启动时或运行时将需要的class加载到JVM中。

----执行引擎:负责执行class文件中包含的字节码命令,相当于实际机器上的CPU。

执行引擎也就是执行一条条代码的流程,而代码都包含在方法内,所以执行引擎本质上就是执行一个个方法所串起来的流程,也就是对应我们通常所说的Java线程,每个Java线程就是一个执行引擎的实例。

----内存区:将内存区划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,

如实际机器上的各种功能的寄存器或者PC指针的记录器等。

执行引擎在执行一段程序时需要存储一些东西,如操作码需要的操作结果、操作数等,这些都保存在内存中。

----本地方法调用:调用C或C++实现的本地方法的代码返回结果等。

6a14385724b4f85251f5dcd2f1c753b0.png
7273f139fd4259fb9ebe8757e9a71c1f.png

3、 JVM工作机制

通常一个程序从编写到执行会经历一下一些阶段:

源代码(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标代码(object code)→链接器(Linker)→可执行程序(executables)

除了源代码和最后的可执行程序,中间的所有环节都是由现代意义上的编译器统一完成的。

不管是何种指令集都只有几种基本的元素:加、减、乘、求余、求模等。这些运算又可以 进一步分解成二进制运算:与、或、异或等。这些运算又通过指令来完成,而指令的核心目的就是确定需要运算的种类(操作码)和需要运算的数据(操作数),以及从哪里(寄存器或栈)获取操作数,将运算结果存放到什么地方(寄存器或是栈)等。这种不同的操作方式又将指令划分成:一地址指令、二地址指令、三地址指令和零地址指令等n地址指令。相应的指令集会有对应的架构实现,如基于寄存器的架构实现或基于栈的架构实现,这里的基于寄存器或者栈都是指在一个指令中的操作数是如何存取的。

4、 JVM基于栈设计的理由

----JVM要设计成与平台无关的,而平台无关性就要保证在没有或有很少的寄存器的机器上也要同样能正确的运行代码。

----为了指令的紧凑性。

5、 执行引擎的架构设计

每当创建一个新的线程时,JVM会为这个线程创建一个Java栈,并分配一个PC寄存器,PC寄存器会指向这个线程的第一行可执行代码。每当执行一个新的方法时,JVM会为这个栈分配一个新的栈帧,栈帧包含了对应方法的参数、内部变量、执行结果等。

a9a843ff6327b606c4241036700d8a16.png

6、 执行引擎的执行过程

21b10c9791682cfa776318a8cdeecdf7.png

直接看上图这段代码,我们来对main方法中的字节码指令做一个分析:

29024382d1eb2721e7bf3d988cd2c459.png

代码执行之前,寄存器的指针指向第一条指令的地址(偏移量0),局部变量区和操作栈都没有数据。代码开始执行之后,根据指令开始操作栈和变量区进行运算。

注意:当main方法中引用了其他方法时,则会创建新的栈帧,寄存器仍旧只有一个。当执行到引用方法时,执行引擎会创建一个新的栈帧,而寄存器保存的是当前栈帧的第一条指令地址,所以值是0。

当执行完return指令时,整个方法对应的栈帧也将撤销,如果当前线程对应的Java栈中没有栈帧,这个Java栈也将被JVM撤销,整个JVM退出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值