目录
一次编译导出运行
在以前, java是编程语言里面的巨头:
在tiobe里面的排名如下:
但是随着大数据以及人工智能的发展, java语言的地位有所下降:
之所以说一次编译到处运行, 就是因为字节码文件, 从编译层面屏蔽掉了各种操作系统提供的不同的系统指令.
对于java代码来说, 我只需要通过前端编译器将其编译成字节码, 只要是安装了对应版本的JVM的系统, 都可以运行这个字节码
通过JVM去适应不同的操作系统, 屏蔽掉不同操作系统的API, 然后JVM就作为底层软硬件和字节码文件的接口.
虽然在不同的系统上, 需要不同的JVM的实现, 这一定程度上决定了JVM必定有很多中版本去管理, 但是这个对于能让Java语言到处运行的好处是微不足道的 ...
JVM不只是虚拟机, 更是一个平台
不只是java, , 只是需要不同的编译器而已, 针对不同的语言, 开发出不同的编译器将他们编译成符合JVM规范的字节码(一种二进制文件)文件, 就可以在JVM上面运行...
例如你在使用Idea的时候, 经常会看到 Kotlin 语言 .. .
对于JVM来说, 它只关心字节码文件是否符合要求, 是否能正常加载, 至于你怎么来的字节码我不关心, 然后这些编程语言为了能在JVM上运行, 就需要一种编译器能够将他们编译成符合JVM规范的字节码文件, 于是就衍生除了各种编译器.
例如你经常用的javac
所以说JVM具有语言无关性,
虚拟机? Java虚拟机?
虚拟机是一个很广阔的概念, 它包含了Java虚拟机,
虚拟机是指通过软件来模拟一个具有完整硬件系统功能的, 运行在一个完全隔离的环境中的完整的计算机系统.
创建虚拟机的时候需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存, 每个虚拟机都有独立的cmos, 硬盘, 和操作系统, 可以像操作实体机一样操作虚拟机.
Java虚拟机, 是虚拟机的一种, 也就是我们口中说的JVM, 它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的. JVM通过仿真模拟计算来执行字节码文件.
JVM的特点是:
- 一次编译到处运行
- 自动内存管理
- 自动垃圾回收
JVM在计算机系统中所处的位置
JVM是运行在操作系统之上的一个软件, 与硬件没有直接的交互.
准确来说, JVM通常位于操作系统和Java应用程序之间。它作为一个中介层,将Java字节码转换为操作系统能够理解的机器代码。JVM在计算机系统中执行Java程序时,负责处理内存管理、垃圾回收等任务,确保Java程序可以在不同的硬件和操作系统上运行一致
JVM的体系结构
- 通过前端编译器, 将编程语言的文件编译成字节码文件, 也就是Class文件
- 将class文件交给类装载器子系统, 将其加载为JVM可以识别的内存结构(JVM内部的数据结构)
- 这些数据结构就是下图中的运行时数据区的体现
- 然后通过 执行引擎, 逐条解释字节码指令并执行
- 如果java代码中调用了来C/C++中的方法, 也就是本地方法接口, 同样会被执行引擎解释执行.
在类加载过程中,字节码验证器确保加载的字节码符合JVM规范,以防止恶意代码破坏虚拟机的运行
Java代码的执行流程
java代码首先需要经过一系列程序被加载成字节码文件. java代码一般要经过如下几个阶段:
JVM生命周期
分为三个步骤
- 虚拟机启动
- 虚拟机执行java代码
- 虚拟机退出
- 异常退出
- 正常退出
虚拟机启动:
Java虚拟机(JVM)的启动过程是由Java运行时载入并初始化主类(包含main方法的类)来控制的
这里是一个简化的步骤说明:
- 启动JVM:操作系统执行Java命令,并启动JVM进程
- 载入主类:JVM的类加载器会加载包含main方法的类
- 链接:JVM验证类的字节码是否正确,为类变量分配内存,并将类标记为已加载
- 初始化:如果该类有初始化方法,则执行之
- 执行main方法:JVM调用main方法,开始执行应用程序的入口点
虚拟机执行:
也就是执行Java代码, 通过执行引擎来进行解释执行
虚拟机退出:
- 程序正常执行结束
- 程序在执行过程中遇到了异常或错误而异常终止
- 由于操作系统出现错误而导致Java虚拟机进程终止
- 某线程调用Runtime类或system类的exit方法,或Runtime类的halt
- 方法,并且Java安全管理器也允许这次exit或halt操作。
- 除此之外,INI(Java Native Interface)规范描述了用JNI
- Invocation API来加载或卸载 Java虛拟机时,Java虚拟机的退出情况。