JAVA基础——JVM原理与机制(一)

JVM这部分的内容非常多,也非常重要。重要在它提供了Java运行环境,无JVM,无从谈起Java开发;重要在它几乎是面试必问内容;重要在他是能否用好Java的关键所在。

JVM就是Java虚拟机,简单说就是虚拟一个计算机,在学习计算机体系结构时我们知道,要让机器具备计算功能,需要以下几个部分:

指令集:计算机能识别的机器语言指令;计算单元:执行指令的模块。寻址方式:光有指令不行吧,还得取操作数,保存结果等,从哪取?往哪放?这就需要寻址方式(直接、间接、寄存器寻址等)。存储的地方:寄存器、存储单元等。

其中,与我们写的代码执行关系最紧密的要数指令集,其余部分会由虚拟机或者操作系统帮我们去做,我们要做的就是,写好代码。对JVM来说,指令集就是JVM字节码指令集,也即class文件,牛逼的java开发首先能很好的控制JVM,要想很好地掌握和控制JVM,就必须先学好JVM原理。

如果将冯诺依曼体系结构做个概括,其包含三部分:存储、I/O(冯诺依曼体系的输入输出设备)、计算(包含冯诺依曼系统中的控制器和运算器),JVM也符合这一体系。学习这部分时始终要思考的是JVM是如何计算的(运行机制),为了支撑之一运行机制,又需要什么样的存储机制?本篇博客的目的就是理清楚JVM的体系结构和运行机制。如图以概之,为JVM的体系结构图:

咬文嚼字做一波解释:

类加载系统:JVM要执行它能认识的指令(class文件),首先得加载吧?为了正确地加载class,需要一套类加载机制;

运行时数据区:加载class后,所有的指令以及指令中包含的操作数、中间结果、运算符等都保存在这一区域。

执行引擎:等同于冯诺依曼机中的计算单元ALU,专门用于计算,干的事就是解析JVM字节码指令,得到执行结果。有两种主要的引擎,SUN的Hotspot是基于栈的执行引擎,GOOGLE的dalvik是基于寄存器的执行引擎;

自动内存管理:这部分就是java程序猿没C程序猿那么痛苦的原因所在了,JVM替我们做了内存管理的工作,如垃圾回收等,让我们不至于面临那么多的内存泄漏的问题,当然如果使用不当,依然有很多的内存问题。

本地方法接口(栈):与虚拟机栈的作用类似,为JVM运行native方法准备的空间,又叫C栈,因为这些方法通常由C实现。JVM执行程序时会记录某个方法的执行次数,如果达到一个阈值(客户端一般1500次,服务器一般10000次)时JIT就会编译这个方法为本地代码。

以上五个部分,出去本地方法栈较简单,其余部分分四篇总结和学习。其中本篇会总结执行引擎部分。

以下是JVM执行引擎的示意图:

线程三个一:创建线程时会为该线程创建一个java栈,分配一个PC寄存器,指向第一行代码

方法一个一:每调用一个新方法都会创建一个新的栈帧,栈帧会保存一些元信息,如方法的局部变量,正常方法返回,异常处理机制等。JVM调用某些指令时会使用常量池的一些常量,或者某个引用指向的实例化对象,这部分数据都保存在方法区和堆中。方法的执行其实就是方法调用栈的入栈和出栈操作,PC寄存器保存的是下一条指令的地址(正常是当前栈帧的下一条,方法返回时是恢复调用栈的下一条)。方法结束时,栈帧内的数据也会释放,因此基于栈的执行引擎中方法栈不是GC垃圾回收的主要对象。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值