最近,在学习java虚拟机的内容中,在此总结和记录下学到的。

一、JVM在计算机中的位置

在我们初学java时,便知道java源文件文件会先通过Java编译器编译成字节码文件,这个过程是java编译过程。而我们的java虚拟机执行的就是字节码文件。这个字节码文件可以来自许多地方,例如kotlin,scala等。但只要它能符合java虚拟机的规范,他就可以执行该字节码文件。下面,我们先来看下jvm在我们计算机中的位置。

 

 

 首先,在我们计算机硬件上的第一层软件就是操作系统了,而jvm是基于操作系统之上的,他并没有与硬件有直接的交互。

其次,用户可通过Java编译器编译生成字节码文件,让字节码文件在jvm上执行。

 

二、jvm体系结构概览

jvm的体系结构如下图

 

类加载子系统

 类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识;

运行时数据区

Java虚拟机在运行程序的过程中会把它所管理的内存划分为若干个不同的数据区,即分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
若可以按照是否线程共享则分为两块,线程共享的是方法区(Method Area)和堆(Heap),线程独享的是虚拟机栈(VM Stack)(java栈),本地方法栈(Native Method Stack)和PC寄存器(Program Counter Register)。

执行引擎
执行引擎是jvm最核心的部分,jvm是java虚拟机,有自己实现的指令集和执行引擎结构体系,能够支持那些不被硬件直接支持的指令集。负责执行class文件中包含的字节码指令,相当于实际机器上的CPU。

本地方法接口

提供一个标准的方式让java程序通过虚拟机与原生代码进行交互,这也就是我们平常常说的java本地接口。用于调用C或C++实现的本地方法的代码返回结果。

三、jvm采用的指令集架构

栈的指令集架构和寄存器的指令集架构

由于java跨平台的设计,java的指令都是根据栈来设计的,不同平台CPU架构不同,所以不能设计为基于寄存器的。

两个指令集架构的区别:

栈:跨平台性、指令集小、指令多;执行性比寄存器差

寄存器:指令少

 

四、JVM的生命周期

1.启动

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

2.执行

一个运行中的java虚拟机有着一个清晰的任务:执行Java程序;

程序开始执行的时候他才运行,程序结束时他就停止;

执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。

3.退出

程序正常执行结束

程序异常或错误而异常终止

操作系统错误导致终止

某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作

除此之外,JNI规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况

 

 

版权声明:本文为lwkdbk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lwkdbk/p/12704252.html