深入理解jvm执行引擎

本文详细阐述了Java字节码的编译过程,包括前端编译为class文件,后端编译为机器码。介绍了解释执行和编译执行的区别,以及JVM如何通过JIT和热点代码识别来提升执行效率,特别讲解了C1和C2编译器在不同场景下的应用。

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

字节码是如何执行的?

前端编绎和后端编绎

由上图可见,java的编绎过程分为二步。第一步由java文件编绎成class文件,这个过程叫做前端编绎;第二步把需要加载到jvm中的class文件中的字节码编绎成操作系统能够识别的机器码,这个过程叫做后端编绎。

解释执行与编绎执行

        class文件中保留了每一行的Java代码对应的字节码指令,执行引擎要怎么执行一段Java代码,其实在Class文件中已经明确了。执行引擎就是将Class文件的字节码解释成对应的操作系统的机器码,接着再由服务器执行。本质上,就是一个翻译。

        jvm是如何做这个解释工作?最简单的就是,执行一条指令就翻译一下。早期的JVM是这和执行的。这就是解释执行

        这种方式需要在上层语言和机器码之间经过中间一层JVM字节码的转换,当然这种方式比不上C、C++直接面向本地机器码的语言。

        如何提升执行效率?

        JAVA的基本思想就是维护一个缓存,CodeCache,将那些字节码指令,提前编绎出来,放到缓存里。到执行的时候,直接从缓存中查询。这种先编绎,后执行的方式就称为编绎执行

        但是JAVA官方也不知道程序会写出什么的代码,因此,无法提前维护一个字节码缓存。只能退而求次,将那些热点代码提前编绎出来,放到缓存里。这样,能提高那些经常调用的代码的效率。完成这个任务的编绎器,就叫JIT(Just In Time Compiler).

        使用java -verion就能看到

从这可以看到,jdk默认采用的是混合的执行方式。

热点代码识别

使用JIT实时编绎的前提就是要识别出热点代码。要能识别出哪些代码是热点代码,需不需要触发即时编绎,这个行为称为“热点探测”(Hotsport Code Detection)。hotspot为每个方法提供了二种计数器方法:方法调用计数器(Invocation Counter)和回边计数器(Back Edge Counter).

方法调用计数器       

统计方法被调用的次数。每调用这个方法一次,这个次数就就会加1.当这个数值达到阈值时,就认为这个对应的代码是一个热点代码。然后向JIT提交一个针对该方法的代码编绎请求。

回边计数器

统计一个方法中循环代码执行次数。在字节码中遇到控制流向后跳转的指令称为“回边(Back Edge)",建立回边计数器的目的是为了发现一个内部频繁调用的的循环调用。

回边计数器阈值 =⽅法调⽤计数器阈值(CompileThreshold)×(OSR
⽐率(OnStackReplacePercentage)-解释器监控⽐率(InterpreterProfilePercentage)/100
其中OnStackReplacePercentage默认值为140,InterpreterProfilePercentage默认值为33,如果都取默认
值,那Server模式虚拟机回边计数器的阈值为10700。回边计数器阈值 =10000×(140-33)=10700

客户端编绎器和服务端编绎器

Hotspot虚拟机内置了二个即时编绎器,分别为”客户端编绎器(Client Complier)"和"服务端编绎器(Server Complier)",简称为"C1"和"C2"编绎器。

客户端编绎器

C1相当于一个初级翻译。编绎过程中,会对字节码进行简单的和可靠的优化,耗时短,以达到更快的编绎速度。启动快,占用内存小。可是翻译出来的的机器码优化程序不高。比较独适合小巧桌面应用,因此也称为客户端编绎器。

服务端编绎器

C2相当于一个高级翻译。编绎过程中,C2会对字节码进行更加激进的优化,优化后的代码执行效率会更高。但是相应,工作量也变得更大了。C2的启动慢,占用内存大,执行效率高。因此,比较适合资源充裕的服务级应用,因此也称为服务端编绎器。

相关系列

深入理解JVM后端优化技术-方法内联-CSDN博客

深入理解JVM后端优化技术-逃逸分析(Escape Analysis)-CSDN博客

深入理解JVM后端优化技术-锁消除 lock elision-CSDN博客

深入理解JVM后端优化技术-锁粗化(Lock Coarsening)-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值