jit即时编译

即时编译器(JIT)的概念以及更广泛的自适应优化是除Java(.Net,Lua,JRuby)之外的许多语言中众所周知的概念。

为了解释什么是JIT编译器,我想先定义一个编译器概念。 根据维基百科,编译器是“将源语言转换为另一种计算机语言(目标语言)的计算机程序”。

我们都熟悉静态Java编译器(javac),该程序将人类可读的.java文件编译为可以由JVM解释的字节码– .class文件。 那么,JIT编译什么? 在解释什么是“及时”之后,稍后会给出答案。

根据大多数研究,执行时间的80%用于执行20%的代码。 如果有一种方法可以确定那20%的代码并对其进行优化,那就太好了。 这正是JIT所做的–在运行时,它收集统计信息,找到“热”代码,将其从JVM解释的字节码(存储在.class文件中)编译为由操作系统直接执行的本机代码,并对其进行大量优化。 最小的编译单位是单一方法。 编译和统计信息收集是通过特殊线程与程序执行并行进行的。 在收集统计信息期间,编译器对代码功能进行假设,随着时间的流逝,尝试证明或反证它们。 如果假设不成立,则将对代码进行优化,然后再次重新编译。

之所以选择Sun(Oracle)JVM的“热点”,是因为该虚拟机能够在代码中找到“热点”。

JIT有哪些优化?
让我们仔细看看JIT所做的更多优化。

  • 内联方法–而不是在对象实例上调用方法,而是将方法复制到调用者代码。 热方法应尽可能靠近调用者,以防止任何开销。
  • 如果无法从其他线程访问监视器,则消除锁定
  • 用直接方法调用替换接口,以实现仅实现一次的方法,以消除对虚拟函数的调用
  • 在同一对象上连接相邻的synchronized
  • 消除无效代码
  • 对非易失volatile变量的直接存储器写操作
  • 删除预检查的NullPointerException和IndexOutOfBoundsException
  • 等等

Java VM调用Java方法时,它将使用已加载的类对象的方法块中指定的调用者方法。 Java VM具有多个调用程序方法,例如,如果该方法是同步的或本机方法,则使用不同的调用程序。 JIT编译器使用其自己的调用程序。 Sun生产发行版检查方法访问位的值ACC_MACHINE_COMPILED,以通知解释器该方法的代码已经编译并存储在装入的类中。 JIT编译器将方法块编译为该方法的本机代码,并将其存储在该方法的代码块中。 编译代码后,将设置Sun平台上使用的ACC_MACHINE_COMPILED位。 我们如何知道JIT在程序中正在做什么以及如何对其进行控制?

首先禁用JIT可以使用Djava.compiler = NONE参数。

Hotspot中有两种类型的JIT编译器–一种用于客户端程序,一种用于服务器(VM参数中的-server选项)。 在服务器上运行的程序通常比在客户端上运行的程序享有更多的资源,并且对服务器来说,程序的最高吞吐量通常更为重要。 因此,服务器中的JIT会消耗更多资源,并且收集统计信息会花费更多时间来使统计信息更加准确。 对于客户端程序,方法的静态收集持续1500个方法调用,对于服务器15000。可以通过– XX:CompileThreshold = XXX VM参数更改这些默认值。

为了找出默认值是否适合您,请尝试启用“ XX:+ PrintCompilation”和“ -XX:-CITime”参数,这些参数将打印JIT统计信息和JIT花费的时间。

基准测试

大多数基准测试表明,JIT代码的运行速度比解释代码快10至20倍。 完成了许多基准测试。 下面给出了其中两个的结果图:

值得一提的是,以JIT模式运行但仍处于“学习模式”的程序比非JITed程序运行慢得多。

准时制的缺点

JIT增加Java程序中不可预测性和复杂性的水平。 它增加了开发人员并不真正理解的另一层。 可能的错误示例-并发中的“关系发生前”。 如果更改对于在单线程中运行的程序是安全的,则JIT可以轻松地对代码重新排序。 为了解决此问题,开发人员使用“同步”字或显式锁定来提示JIT。 增加非堆内存占用量– JIT代码存储在“代码缓存”生成中。

先进的准时制

JIT和垃圾回收。

  • 要使GC发生,程序必须达到安全点。 为此,JIT定期在本机代码中插入屈服点。
  • 除了扫描堆栈以查找根引用外,还必须扫描寄存器,因为它们可能包含JIT创建的对象

参考: The Art of Java博客中我们的JCG合作伙伴 Art Gourevitch 在Hotspot中提供的Just in Time Compiler(JIT) 。

翻译自: https://www.javacodegeeks.com/2012/06/just-in-time-compiler-jit-in-hotspot.html

jit即时编译

jit即时编译_热点中的即时编译器(JIT)相关推荐

  1. JVM 虚拟机 AOT 和 JIT 即时编译

    文章目录 JVM 虚拟机 AOT 和 JIT 即时编译 1.AOT 2.JIT JVM 虚拟机 AOT 和 JIT 即时编译 1.AOT AOT 是 Ahead Of Time ,运行前编译 与 JI ...

  2. (三)JVM成神路之全面详解执行引擎子系统与JIT即时编译原理

    引言 执行引擎子系统是JVM的重要组成部分之一,在JVM系列的开篇曾提到:JVM是一个架构在平台上的平台,虚拟机是一个相似于"物理机"的概念,与物理机一样,都具备代码执行的能力.但 ...

  3. JIT 即时编译及优化技术

    JIT 即时编译及优化技术 前言 即时编译 热点代码探测 编译优化技术 语言无关的经典优化技术之一:公共子表达式消除 语言相关的经典优化技术之一:数组范围检查消除 最重要的优化技术之一:方法内联 最前 ...

  4. Java真的是一门编译型的语言吗——即时编译器JIT

    Java真的是一门编译型的语言吗--即时编译器JIT 如有错误请大佬指正 JIT是什么 JIT(Just-in-Time,实时编译)一直是Java语言的灵魂特性之一. 让我们回忆一下Java程序是如何 ...

  5. JVM成神路之全面详解执行引擎子系统、JIT即时编译原理与分派实现

    引言 执行引擎子系统是JVM的重要组成部分之一,在JVM系列的开篇曾提到:JVM是一个架构在平台上的平台,虚拟机是一个相似于"物理机"的概念,与物理机一样,都具备代码执行的能力.但 ...

  6. 【Flutter】Dart 语言 ( Dart 语言特征 | JIT 即时编译 | AOT 静态编译 )

    文章目录 I . Dart 语言特征 II . JIT 即时编译 III . AOT 静态编译 I . Dart 语言特征 1 . Dart 语言特征 : ① 语言类型 : 强类型语言 ; ② 编译类 ...

  7. JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)

    以下总结自:<深入理解java虚拟机> + 宋红康老师视频 字节码文件介绍:深入理解JVM之Java字节码(.class)文件详解_Windy_729的博客-CSDN博客_字节码文件 JV ...

  8. javac参数 编译警告关闭_JVM之JIT即时编译

    当今Java语言被广为接受的优点之一就有即时编译,即时编译的存在使得Java应用可以运行时间的增长而获得更高的性能. 如果有对jvm做过研究的朋友,一定听说过这样一段话:由于即时编译技术的进步,尤其是 ...

  9. java jit 即时编译_JVM即时编译(JIT)

    版权声明:本文为CSDN博主「nogos」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/sunxiang ...

最新文章

  1. 一文盘点数据行业的动态演变
  2. 【转】玩转git分支
  3. leetcode 658. Find K Closest Elements | 658. 找到 K 个最接近的元素(二分查找+双指针)
  4. centos 6.5 rpm mysql_Linux平台(CentOS 6.5) RPM包方式安装 Mysql 5.7
  5. sqoop把mysql数据导入hbase-完整记录
  6. 快手高级Java四轮面试题:设计模式+红黑树+Java锁+Redis等
  7. docker更新容器命令 ,自启
  8. python俗称_python为什么叫爬虫?
  9. js中函数参数值传递和引用传递
  10. python 开发工具_Python开发工具之神兵利器
  11. win11右键菜单怎么修改 Windows11修改右键菜单为win10风格的步骤方法
  12. Mac新手必备技巧-如何使用 macOS 帮助菜单?
  13. 大学计算机基础题库百度云资源,《大学计算机基础试题题库及答案》.pdf
  14. 【前端杂记】断点续传
  15. 3dmax贴图材料丢失如何恢复
  16. 二分类模型性能评价 2.0(ROC曲线,lift曲线,lorenz曲线)
  17. 华为路由器后台登录协议
  18. 知识产权产业化的发展未来
  19. 输入一个整数求其位数和各个位数之和
  20. 大学专业有C语言专业吗,大学里哪些专业开设C语言、数电、模电、单片机、嵌入式等课程?...

热门文章

  1. Java开发必会的反编译知识
  2. JSON Web Token (JWT),服务端信息传输安全解决方案
  3. javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Service层
  4. cs1.5 linux服务端,Linux下架设CS1.5服务器
  5. java后台 flex前台例子_flex+blazeds+java后台消息推送(简单示例)
  6. 6 使用soap客户端_网络协议 20 - RPC 协议(上)- 基于XML的SOAP协议
  7. python下面的代码_解析一下下面的python代码?
  8. easyui根据select下拉框内容更新表单内容_Ant Design 4.0 的一些杂事儿 - Select 篇
  9. python绘图时的分解问题的步骤-零基础学python-15.2 分解函数
  10. 583. 两个字符串的删除操作用时6ms的另类解法