JVM与Java的体系结构(JVM入门知识体系总结)

写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。

目录:
1.Java和JVM简介
       
Java的跨平台性
       
JVM跨语言的平台
       
JVM的位置、作用特点
2.Java代码执行流程
3.栈的指令集架构和寄存器的指令集架构
4.JVM的生命周期

1.Java和JVM简介

1.1Java的跨平台性

我们都知道java是可以跨平台的,其实我们字节码文件本身就可以跨平台的,不同操作系统有不同版本的JVM,但是对字节码文件的识别都是一样的

在这里插入图片描述

1.2JVM跨语言的平台

其实我们Java虚拟机不是说只能解释Java的字节码文件,还能解释其他语言的字节码文件,只不过需要我们在编译其他的语言的时候,编译器遵循JVM的规范,那么JVM就可以对其进行解释也就是说Java虚拟机不关心运行在其内部的程序是何种语言编写的而只是关心字节码文件
在这里插入图片描述

1.3JVM的位置、作用特点

1.JVM的位置
在这里插入图片描述
2.JVM的作用和特点

在这里插入图片描述

2.Java代码的执行流程

在这里插入图片描述

Java源代码---->编译器(前端编译器)---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。
字节码文件:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。

我们看上图可以发现一个java源代码变成机器指令有两个编译的过程

  1. 前端编译:把java源码编译成字节码文件
  2. 后端编译:就是JIT编译器,把字节码指令编译成机器指令

3.JVM的指令架构

Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则
基于寄存器的指令集架构。

基于栈式架构的特点:

  • 设计和实现更简单,适用于资源受限的系统;
  • 避开了寄存器的分配难题:使用零地址指令方式分配。 即是一个栈的操作,我们只需要关心栈顶
  • 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小, [但相比于寄存器操作更多,一会儿会有解释]编译器容易实现
  • 不需要硬件支持,可移植性更好,更好实现跨平台。栈是一个内存层面,不跟硬件打交道

基于寄存器架构的特点:

  • 典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虛 拟机。
  • 指令集架构则完全依赖硬件,可移植性差
  • 性能优秀和执行更高效: 因为基于cpu,比较快,对硬件耦合度较高
  • 花费更少的指令去完成一项操作。
  • 在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令 和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。

举个例子:我们同样进行2+3的操作,基于栈和寄存器的计算流程如下:

上边是基于栈,下边是基于寄存器的
在这里插入图片描述
我们可以发现完成一个指令,栈的指令集小,但指令多,寄存器指令集大,指令少

总结:

由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台, 指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

4.JVM的生命周期

4.1JVM的启动

通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的.

4.2JVM的执行
  • 一个运行中的java虚拟机有着一个清晰的任务:执行Java程序;
  • 程序开始执行的时候他才运行,程序结束时他就停止;
  • 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
4.3JVM的退出
  • 程序正常执行结束
  • 程序异常或错误而异常终止
  • 操作系统错误导致终止
  • 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作
  • 除此之外,JNI规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/107082419