什么是虚拟机?以及执行引擎的优化

本文探讨了虚拟机的概念,与物理机的区别,以及Java编译过程中的前端与JIT区别。重点讲解了解释执行和JIT编译的应用场景,以及HotSpot虚拟机如何结合这两种方式提高性能。深入剖析了JIT编译中的优化技术,如方法内联、逃逸分析、栈上分配等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本科时候阅读过虚拟机相关的书籍。这里我对自己提几个问题
1、什么是虚拟机?与物理机有什么区别?
我们知道虚拟机和物理机都可以有代码执行能力,而物理机是建立在操作系统、处理器、缓存、指令集上,而虚拟机可以与本地物理机无关,从而可以制定不同的指令集和不同结构体系的执行引擎,而且不需要关心这些在虚拟机执行引擎上执行的指令是否能够被物理机执行。

2、将.java文件编译为.class文件和JIT的编译是一个意思吗?
一般我们把.java->.class称为前端编译,而JIT是执行引擎将字节码文件转化为本地机器码的方式,另一种叫做解释执行。
3、什么是解释执行?什么是JIT编译?
解释执行是将字节码文件逐行解释,翻译成本地机器码的过程。
JIT是直接将整个字节码文件翻译成本地机器码的过程。注意翻译后的代码会被缓存到方法区。
4、我们常说JIT极大的提高了虚拟机的性能,HotSpot 虚拟机就是高性能虚拟机的典范,其使用了解释执行和JIT编译执行两种方案结合的方式,为什么不仅仅使用JIT呢?
首先应该明白代码执行时,若是解释执行则不需要将整个代码编译优化后才执行,直接可以翻译为本地机器码执行,响应速度快。而JIT 将整个代码编译为机器码后执行的速度自然很快。所以对于不同的应用场景,才有了不同的虚拟机。比如服务端对于启动时间不是很在意,则可以将源代码翻译为本地机器代码后再提供服务。对于看重启动时间的场景而言就需要启动时就应该执行代码,之后随着时间的推移jit编译部分代码提高效率,从而在二者之间寻找一个平衡。
5、JIT编译集中了大量优化技术,你可以讲一些吗?

方法内联:我们知道在编译期可以确定的方法调用版本大致有父类方法、静态方法、构造方法、私有方法等非虚方法,对于这些方法当然可以做内联,其实编译器对于虚方法也做方法内联,经过类继承关系分析后对于某一方法若只有一个版本可供选择,则可以内联,之后若继承关系改变则退回到解释执行或者重新编译。“更有甚者”虽然有多个版本,但每次调用的是一个版本仍进行优化内联。

逃逸分析:他只是一种辅助其他优化手段(栈上分配、同步消除、标量替换)的技术!逃逸分析主要是分析对象的作用域,分为方法逃逸:如果方法内定义的变量只是在方法内部使用,而不是作为返回值、或者作为参数传递给其他方法;线程逃逸:如果变量有可能被其他线程访问修改,如给类变量赋值或可以在其他线程中访问实例变量。
(1)栈上分配:如果确定方法内变量不会方法逃逸,即该变量只是在方法内部使用,从而可以将该对象放在栈上分配。
(2)同步消除:如果锁变量不会被其他线程访问,则对于该变量所做的同步措施可以撤销掉。
(3)标量替换:可以根据聚合对象的访问情况,从而将对像分解为多个成员变量。比如某个对象确定不能被其他方法访问,那么就可以将对象拆分为多个成员并且在栈上分配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值