`
qindongliang1922
  • 浏览: 2180772 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117397
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125814
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59779
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71223
社区版块
存档分类
最新评论

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

    博客分类:
  • JAVA
阅读更多
# 给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字节码转成本地的机器码能更多的提升程序运行效率。

有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs) 路漫漫其修远兮,吾将上下而求索







0
0
分享到:
评论

相关推荐

    java和JIT编译器版本.pdf

    JIT编译器是Java虚拟机(JVM)的一部分,它能够在程序运行时将字节码转换为机器码,从而提高执行效率。了解JIT编译器的不同版本对于优化Java应用程序的性能至关重要。 在Java中,JIT编译器有两个主要类型:Client和...

    TeaVM将Java字节码翻译成JavaScript编译器

    TeaVM是一款独特的工具,它为Java开发者提供了一种将Java字节码直接转换为JavaScript的静态编译器。这款工具的出现,使得Java应用程序能够运行在Web浏览器环境中,无需借助Java Applet或者Java Web Start等传统技术...

    Java JIT编译器概览.pdf

    Java JIT(Just-In-Time)编译器是一种关键的性能优化技术,它在程序运行时将字节码转换为机器码,以提高程序的执行效率。Java程序不是预先完全编译成机器码,而是以字节码的形式存储,字节码是一种平台无关的指令集...

    深入探索Java JIT编译器:原理、优化与实践

    本文将详细介绍Java JIT编译器的工作原理、优化策略以及如何在实际开发中利用JIT提高程序性能。 Java JIT编译器是提高Java程序性能的关键技术之一。通过理解其工作原理和优化策略,开发者可以更好地利用JIT编译器来...

    性能飞跃的催化剂:揭秘Java JIT编译器的魔法

    为了解决这一问题,Java虚拟机(JVM)引入了即时编译器(JIT),这是一种能够在程序运行过程中动态地将字节码编译成本地机器码的技术,从而极大地提升了Java程序的性能。 ##### JIT编译器的工作原理 1. **解释执行...

    轻松看懂Java字节码.pdf

    字节码是一种高级的中间语言,必须由JVM解释执行或通过即时编译器(JIT)编译成本地机器码才能被机器执行。 9. 字节码的实际应用:理解字节码对于调试、性能优化、代码混淆、安全分析等实际应用场景至关重要。...

    Java 字节码简单说明.zip

    Java源代码(.java文件)首先通过Java编译器(javac)转化为字节码文件(.class文件)。每个类都对应一个.class文件,其中包含了类的结构信息(如类名、字段、方法等)和字节码指令。字节码以二进制形式存储,这样...

    一种针对JavaScript引擎JIT编译器的模糊测试方法.pdf

    其中,Just-In-Time (JIT) 编译器是提高JavaScript执行效率的关键技术,它能够将解释执行的JavaScript代码转化为机器码,以达到接近原生应用的运行速度。然而,JIT编译器的复杂性也为其引入了潜在的安全隐患,成为...

    cpp-Minijit用C和Python中从头开始编写的教育目的x8664JIT编译器

    5. **调试辅助**:Python脚本可以方便地生成和查看编译后的机器码,这对于理解和调试JIT编译器非常有用。 在压缩包"minijit-master"中,你可能会找到以下内容: - 源代码文件:C语言和Python的实现。 - 示例代码:...

    Java虚拟机即时编译器的一种实现原理

    Java虚拟机即时编译器(JIT)是一种在运行时将Java字节码转换为本地机器码的技术,目的是提高程序执行效率。JIT编译器通常在程序启动后或运行时动态编译代码,这样可以利用运行时的信息进行优化,而静态编译则需要在...

    Java字节码和asm入门资料

    JVM通过类加载器加载字节码,验证其安全性,然后通过解释器执行,或者在支持的情况下,通过Just-In-Time(JIT)编译器将其编译为本地机器代码以提高性能。 4. **ASM框架**: ASM是一个底层的Java字节码操控库,它...

    深入剖析Java中的JVM即时编译器(JIT):工作原理与代码实践

    JIT编译器是Java性能优化的关键,它通过将字节码转换为本地机器码并进行优化,显著提高了Java程序的执行效率。通过理解JIT编译器的工作原理和优化技术,开发者可以更好地编写高效的Java代码。JIT编译器的存在使得...

    cpp-ZetaVM一个用于动态编程语言的虚拟机和JIT编译器

    - **字节码解释器**:负责将特定的字节码指令转换为机器可执行的指令。 - **JIT编译器**:在运行时将热点代码编译成原生机器代码,以提高执行效率。 - **垃圾回收机制**:自动管理内存,确保程序的稳定性和内存安全...

    cpp-rbpf用于eBPF程序的Rust虚拟机和JIT编译器

    开发者可以利用cpp-rbpf提供的API来加载、验证和执行eBPF字节码,同时还可以利用JIT功能来优化性能。 **6. 开发和调试** cpp-rbpf项目的源码位于"rbpf-master"目录下,包含了项目的源代码、构建脚本和测试用例。...

    GraalVM是一个为JVM开发了一个新的JIT编译器和Polyglot运行时

    1. JIT编译器:传统的JVM使用解释器执行字节码,然后在运行过程中通过JIT编译器将热点代码转换为本地机器码,以提高性能。GraalVM的JIT编译器引入了先进的静态分析和优化技术,如提前编译(AOT)和子集编译。它能够在...

    深入JVM即时编译器JIT,优化Java编译

    前端编译是指将.java源文件编译成.class字节码文件的过程,而JIT编译则是发生在Java程序运行时,它将字节码转换为针对特定硬件平台的机器码,以实现更高效的执行。 JIT编译器在运行时能够进行更深层次的优化,这是...

    Recaf一个现代Java字节码编辑器

    JVM负责将字节码解释执行或通过即时编译器(JIT)转化为机器码,提高了程序的运行效率。字节码编辑器允许开发者在不触及原始源代码的情况下对程序进行修改,这对于调试、优化、逆向工程和插件开发等任务非常有用。 ...

    字节码实战包含class,字节码.zip

    字节码是Java源代码经过编译器编译后的中间表示形式,它是一种平台无关的二进制代码。这种设计使得Java具备了“一次编写,到处运行”的特性。字节码由一系列16位的指令组成,每个指令对应一个特定的操作,如加载、...

    该项目主要是JAVA字节码的学习项目.zip

    Java字节码是Java编程语言的核心组成部分,它在Java虚拟机(JVM)上运行,使得Java具有跨平台的能力。这个学习项目显然旨在深入理解Java字节码的工作原理及其在实际开发中的应用。以下是关于Java字节码的详细知识点...

    java编译器

    Java编译器是Java开发中的核心工具,它将人类可读的Java源代码转换成计算机可执行的字节码。这个过程称为编译,对于Java来说,编译器扮演着至关重要的角色,因为它使得Java程序能在不同的操作系统和硬件平台上运行,...

Global site tag (gtag.js) - Google Analytics