概念引入
首先,想问下大家,知不知道什么是JVM,在我们用IDE编写好的代码,为什么能够被执行,并且呈现在眼前,接下来我就对个人阶段性所学知识进行总结。
1. JVM概念
-
什么是JVM?
java虚拟机Java Virtual Machine简称jvm。
JVM是一种能够运行java字节码的虚拟机。
(java字节码指的是从.java源文件经过编译后形成的中间码,其需经过解释器转译后才能形成特定的机器码) -
与Oracle VM VirtualBox区别:

虽然,两者都叫虚拟机,但是实际上是不同的:
1.java虚拟机是支持java语言运行的环境,在不同的操作系统中有区别,在java程序编译后形成的.class文件,能作用于不同的环境中,实现跨平台的特性。
2.Oracle VM是Oracle公司的虚拟机,是作用在程序里面的模拟操作系统,通过此虚拟机相当于让本来的操作系统基础上建立一个系统。 -
为什么要有JVM?
java之所以能够实现跨平台,所实现的基础就是JVM,因为JVM有不同的版本,可以用来支持不同操作系统和机器,而且在编译后的.class文件是通用的,进行转译成机器语言(“0/1”)。
2.JVM引入
-
执行流程图:

-
JVM作用:把经过编译后的字节码文件翻译成相应的机器码然后再由解释器进行处理。
-
示例:
1.打开记事本写一段java程序,保存为java类型


2.之后在cmd命令中javac执行java文件

3.最后再执行java命令,.class文件被解释器转译为机器语言,得出结果。
3.讲解JIT与AOT:
在上述源代码经javac经过编译形成.class字节码文件之后,再通过解释器逐行执行时,执行的速度会相对较慢,而且有些方法和代码块经常会被调用,所以后面引入了JIT编译器(属于运行时编译)。字节码经过JIT环境变量的判断之后,是否属于热点代码(HotSpot Code),那么如果是的话,在JIT第一次编译后,会将字节码相对应的机器码保存下来。
- 热点代码:消耗大部分系统资源的只有那一小部分代码。
- JIT(运行时动态编译):
JIT(just-in-time),“即时编译”,指的是边翻译边运行,不产生目标程序。就是说将源程序中的代码作为一个输入,解释一句后就交付给计算机执行一句,直至完成整个程序。
就类似于:在命令行中,是逐行执行,而不是像DELIMITER语句修改结束符为&&一样
mysql>DELIMITER &&
mysql>CREATE PROCEDURE film_in_stock_definer(IN f_film_id INT,IN f_store_id INT,OUT f_film_count INT)
->SQL SECURITY DEFINER
->BEGIN
-> SELECT inventory_id
-> FROM inventory
-> WHERE film_id=f_film_id
-> AND store_id=f_store_id
-> AND inventory_in_stock(inventory_id);
->
-> SELECT FOUND_ROWS INTO f_film_count;
->END $$
->DELIMITER ;
JVM会根据每次执行的情况收集并相应的做出一些优化,执行的速度随着执行的次数而提高。
-
AOT(静态编译):
AOT(ahead-of-time),"提前编译“,就是说在执行之前全部被翻译为机器码。意思就是,将源程序作为输入,进行编译转译,产生机器语言的目标程序。JDK9引入了此编译模式,直接将字节码编译成机器码,从而避免了JIT预热等各方面的开销。 -
JIT与AOT比较:
1.JIT:
在运行是动态编译,可以只编译那些经常使用的方法(热方法),提高效率;其它的解释。
根据代码结构可能提高或降低java程序执行速度。。
运行时进行本地代码编译而不是在程序运行前编译(C、C++是这种),保证了可移植性。2.AOT:
运行前编译好,缺点是全编译了,不用的也编译了,牺牲了平台无关性和代码质量,因为它们不能利用程序的动态行为,也不具有关于加载的类或类层次结构的信息。
这避免 JIT 编译器的运行时性能消耗或内存消耗,或者避免解释程序的早期性能开销。极大提高java代码性能。JDK支持分层编译和AOT协作使用,但是我们可以知道,AOT的编译质量是比不过JIT的,所以需要适当选择。

被折叠的 条评论
为什么被折叠?



