idea 不能及时编译

还记得上次被C开发人员嘲笑的时候吗? Java如此繁琐,以至于他们甚至都不会考虑使用这种语言?

在许多方面,这一概念仍然成立。 但是对于典型的用法(在大型企业的骨干中),Java性能绝对可以与许多竞争者抗衡。 而这在很大程度上要归功于神奇的JIT。

在开始解释即时编译技巧之前,让我们稍微深入一下背景。

您可能还记得– Java是一种解释型语言。 大多数用户都知道的Java编译器javac不会像C编译器那样直接将Java源文件编译为处理器指令。 而是生成字节码,这是由规范控制的与机器无关的二进制格式。 JVM在运行时解释该字节码。这是Java在跨平台上如此成功的主要原因-您可以在一个平台上编写和构建程序,然后在其他平台上运行。 另一方面,它确实引入了一些负面方面。 其中最严重的一个事实是,解释后的代码通常比直接编译为特定于平台的本机二进制代码的代码要慢。 Sun聘请Cliff Click博士提供解决方案时,已经在90年代末意识到了这种严重性。

欢迎– HotSpot 。 该名称源自JVM识别应用程序中“热点”(经常执行的字节代码块)的功能。 然后将它们作为目标,以进行广泛的优化并将其编译为处理器特定的指令。 通过优化,可以以最少的开销实现对性能要求不高的代码的高性能执行。 在某些情况下, JVM的自适应优化有可能超过手工编码的C ++或C代码的性能。

JVM中负责这些优化的组件称为即时编译器(JIT)。 它利用了有趣的程序属性。 实际上,所有程序都将大部分时间都花在执行少量代码上。 Java HotSpot VM不会及时编译所有代码,而是立即使用解释器运行程序,并在运行时分析代码以检测程序中的关键热点。 然后,它将全球本地代码优化器的注意力集中在热点上。 通过避免不经常执行的代码的编译,Java HotSpot编译器可以更加关注程序的性能关键部分。 这意味着您的编译时间总体上不会增加​​。 当程序运行时,将继续动态地监视热点,以便根据应用程序的使用模式即时调整其性能。

JIT通过多种技术来实现性能优势,例如消除无效代码,绕过边界条件检查,消除冗余负载,内联方法等。

以下示例说明了JIT用来获得更好性能的那些技术。 在第一部分中,有开发人员编写的代码。 在第二个代码段中,是热点检测到热点“热”并应用了优化魔术之后执行的代码:

  1. 未优化的代码。
  2. class Calculator {Wrapper wrapper;public void calculate() {y = wrapper.get();z = wrapper.get();sum = y + z;}
    }class Wrapper {final int value;final int get() {return value;}
    }
  3. 优化代码
  4. class Calculator {Wrapper wrapper;public void calculate() {y = wrapper.value;sum = y + y;}
    }class Wrapper {final int value;final int get() {return value;}
    }

上面的小样本中描述的第一类是开发人员编写的类,第二类是JIT完成工作之后的示例。 该示例包含一些应用的优化技术。 让我们来看看如何达到最终结果:

  1. 未优化的代码。 这是在被检测为热点之前运行的代码:
  2. public void calculate() {y = wrapper.get();z = wrapper.get();sum = y + z;
    }
  3. 内联方法。 wrapper.get()已被b.value取代,因为通过直接访问wrapper.value而不是通过函数调用来减少延迟。
  4. public void calculate() {y = wrapper.value;z = wrapper.value;sum = y + z;
    }
  5. 卸下多余的负载。 z = wrapper.value已替换为z = y,以便通过访问局部值而不是wrapper.value来减少延迟。
  6. public void calculate() {y = wrapper.value;z = y;sum = y + z;
    }
  7. 复制传播。 z = y已由y = y代替,因为没有多余的变量z,因为zy的值相等。
  8. public void calculate() {y = wrapper.value;y = y;sum = y + y;
    }
  9. 消除无效代码。 y = y是不必要的,可以消除。
  10. public void calculate() {y = wrapper.value;sum = y + y;
    }

这个小样本包含JIT用来提高代码性能的几种强大技术。 希望它对理解这个强大的概念很有帮助。
喜欢这个职位吗? 我们还有很多工作要做。 订阅我们的RSS feed或Twitter流并享受。

本文使用了以下相关链接(两个愤怒的C开发人员除外):

  • http://www.oracle.com/technetwork/java/whitepaper-135217.html
  • http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136373.html
  • http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/underst_jit.html

参考: 您是否能及时编译? 由我们的JCG合作伙伴 Nikita Salnikov Tarnovski在Plumbr Blog博客上获得。

翻译自: https://www.javacodegeeks.com/2012/12/do-you-get-just-in-time-compilation.html

idea 不能及时编译

idea 不能及时编译_您是否能及时编译?相关推荐

  1. java文件编译_【java】javac编译多个有依赖关系的java文件为class文件

    历史文章: [javac命令不能使用,提示不是内部命令或外部命令,请查看历史文章] =================需求说明========================== 之前的文章中,仅说明 ...

  2. python so反编译_使用cython把python编译so

    1.需求 为了保证线上代码安全和效率,使用python编写代码,pyc可直接反编译,于是把重要代码编译so文件 2.工作 2.1 安装相关库: pip install cython yum insta ...

  3. ipa文件反编译_手把手教你反编译别人的app

    虽然iOS系统相比于其他手机操作系统相对安全,但是这个安全并不是绝对的,我一直相信,道高一尺魔高一丈.此文想以实际例子出发,告诉大家,如何去反编译一个app,并且从某个角度来说,iOS没有传说中的&q ...

  4. ipa文件反编译_手把手教你反编译别人的iOS App

    下载智可网手机app可以学习更多哦! 虽然iOS系统相比于其他手机操作系统相对安全,但是这个安全并不是绝对的,我一直相信,道高一尺魔高一丈.此文想以实际例子出发,告诉大家,如何去反编译一个app,并且 ...

  5. keil使用命令行编译_用c51命令行编译HEX单片机文件

    刚开始学STC51单片机的开发,用Keil uVision4进行编辑和编译.Keil的IDE是使用工程方式组织,对于小弟初学并不是很方便. 每次做个试验都要建立一个工程,而且会出现一堆文件. 虽然电脑 ...

  6. java8编译_为什么在Java7中编译而在Java8中编译?

    泛型是棘手的. 看起来它们在不同版本的 Java中被区别对待. 此代码在Java 7中成功编译,无法使用Java 8进行编译. import java.util.EnumSet; public cla ...

  7. java程序不能编译_救命-JAVA程序不能编译!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我编了一个javar源程序如下: ublic class TestClassPerson{ /*定义成员变量*/ private String perso ...

  8. java无ide编译_[转]无IDE时编译和运行Java

    本文由 ImportNew - Grey 翻译自 dzone.欢迎加入Java小组.转载请参见文章末尾的要求. 最近Java subreddit出现了一篇"在没有IDE的情况下编译Java包 ...

  9. java 混淆编译_贴一段自动编译java,并混淆编译的代码

    刚写的一个自动编译.混淆.打包jar的代码,做个记录 用到的NuGet: using Ionic.Zip; using System; using System.Collections.Generic ...

最新文章

  1. linux 视频相关资源
  2. java面板如何设置大小_java面板调整大小问题
  3. 技术分享 | 业务模板的技术实践
  4. python 类 文件读写与模块
  5. ormlite更改数据库默认位置
  6. Linux 邮件服务器 之跟我一步一步来实现一个邮件系统
  7. 免费的html空间,免费HTML网页空间(每月200 GB 流量托管静态网页超简单)
  8. 运动社交或将成为“反科技”先锋
  9. 【蓝桥杯单片机(18)】第七届省赛-模拟风控制系统
  10. eth入门之web2 与 web3 的对比
  11. 【实践案例分享】PyFlink 在聚美优品的应用实践
  12. 玩转亚马逊 AWS IoT(3): SpringBoot 2.7 集成 AWS IoT 服务
  13. MATLAB及app designer中函数:定义与调用
  14. 如何录制自己手机视频
  15. 2009级 华中科技大学 计算机学院 本科生名单,华中科技大学2009届本科生.doc
  16. 手机软键盘的发送按键和确认按键调用方法
  17. 6.论文学习Modality-aware Mutual Learning for Multi-modal Medical Image Segmentation
  18. java实现头像上传 前后端
  19. 官方源、镜像源汇总合集
  20. SpringBoot集成elasticsearch使用

热门文章

  1. JTA 深度历险 - 原理与实现
  2. Java数据库连接池--DBCP浅析
  3. 到底什么是跨域?附解决方案
  4. vue前期知识点笔记
  5. 调用反射类的指定方法
  6. 2020蓝桥杯省赛---java---B---5(排序)
  7. 2020蓝桥杯省赛---java---B---10(整数小拼接)
  8. python django 是啥_python的django做什么的
  9. 反射、HashMap、ArrayList与LinkedList区别
  10. php处理j数组,PHP Bean 类处理 数组处理