给Java字节码加上”翅膀“的JIT编译器

2024-05-15 02:48

本文主要是介绍给Java字节码加上”翅膀“的JIT编译器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给Java字节码加上”翅膀“的JIT编译器

上面文章在介绍Java的内存模型的时候,提到过由于编译器的优化会导致重排序的问题,其中一个比较重要的点地方就是关于JIT编译器的功能。JIT的英文单词是Just In Time翻译成中文就是及时,恰好的意思,意在说明JIT编译器优化java的class文件里面的byte code是拿捏的恰到好处。

JIT编译器是JRE里面的一个为了在运行时提升Java程序性能的一个重要组件,我们知道Java代码一大优势就是在于一次编写,到处运行的特点。Java程序通常在编译后是一大堆class文件,也就是我们所说的字节码,然后通过JVM来解释执行这些与平台无关的字节码,从而屏蔽了操作系统的差异,做到了跨平台的特点。但jvm在在运行时候执行class文件的字节码的时候性能并没有执行跟操作系统直接有关的机器指令性能来的快,正是因为这个原因,才出现JIT编译器,目的就是为了提高执行效率。

到这里,我们再总结下JIT编译器的定义:

在Java程序运行时把一些class文件的字节码给转变成操作系统本地的指令码,从而提升程序性能。

如下图: 

在上面的图我们能够看到,我们的java源文件先在编译时被转成class字节码文件,然后在运行时会在当一个方法第一次调用时会被JIT再次编译优化转成native machine code也就是上面说的操作系统级别的指令。

这里面大家注意到仅仅当方法第一次调用时才会进行JIT优化,那么有个问题是既然JIT编译器优化运行时执行性能,为啥不把所有的方法都优化一次呢,而非得时用到的时候才优化呢? 这正是just in time写照。 当JVM启动时候,实际上是会加载数千个方法的,理论上把所有方法都提前通过JIT转换一下是会提升更多运行性能,但实际情况是JIT编译优化是需要耗费一定的cpu和内存资源(用来缓存指令),这也意味着如果直接优化所有方法,有可能导致jvm启动的非常慢,即使它能在运行时带来的一定的性能提升。

此外,JIT在运行时做编译优化是需要重新理解字节码的语义的,为了分析方法,它的字节码会被转成一种叫做trace tree的数据结构,然后根据方法的trace tree来做相关分析和优化,最终字节码会被转成本地的机器码。当然JIT会使用多线程来编译task,从而使java应用程序也就是jvm启动的更快。到这里相信看了我上篇文章的同学们,就会明白重排序的问题。

你看到的代码顺序,未必是其执行顺序

这其实就是因为JIT在底层编译优化的时候为了提升编译的性能,是会把字节码放到多个线程里面的执行的,当然这里面必须保证单线程JIT优化不影响最终结果的逻辑,这就是后面会提到的关于 happend-before的约束。

最后我们来看下JIT编译优化的包括几个方面:

(1)代码内联 (合并trace tree里面小的方法)

(2)本地优化(本地分析和优化代码的一小部分,通常使用静态编译器)

(3)控制流优化(重新排列控制流的代码路径进行优化)

(4)全局优化(对整个方法进行优化)

(5)本地字节码生成(根据不同的操作系统,生成对应优化的本地机器码)

总结:

本篇文章主要介绍了Java里面JIT编译器相关的内容,通过学习我们应该认识到Java编译的字节码方法并不一定是直接就运行的,更多时候是会以 “延迟加载” 形式通过JIT优化,这样把Java字节码转成本地的机器码能更多的提升程序运行效率。

这篇关于给Java字节码加上”翅膀“的JIT编译器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/990591

相关文章

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Java中的JSONObject详解

《Java中的JSONObject详解》:本文主要介绍Java中的JSONObject详解,需要的朋友可以参考下... Java中的jsONObject详解一、引言在Java开发中,处理JSON数据是一种常见的需求。JSONObject是处理JSON对象的一个非常有用的类,它提供了一系列的API来操作J

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然