热点中的即时编译器(JIT)

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

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

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

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

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

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中提供的即时编译器(JIT) 。


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jq查找字段忽略html标签,jQuery过滤HTML标签并高亮显示关键字的方法

本文实例讲述了jQuery过滤HTML标签并高亮显示关键字的方法。分享给大家供大家参考。具体如下:jQuery实现网页关键字过滤效果,将需要过滤的文字定义在JavaScript中,可定义多个,不过要修改JS代码为数组,这样可过滤出多个…

java.lang.NoClassDefFoundError:如何解决–第1部分

线程“ main”中的异常java.lang.NoClassDefFoundError是开发Java EE企业版或独立Java应用程序时可能会遇到的常见难题之一。 根本原因分析和解决过程的复杂性主要取决于Java EE中间件环境的大小。 特别是考虑到各种Java EE应用程序中存在大量的ClassLoader。 我向您建议的一系…

android 日期国际化,Flutter 日期时间选择类控件及国际化

注意:无特殊说明,Flutter版本及Dart版本如下:Flutter版本: 1.12.13hotfix.5Dart版本: 2.7.0DatePickerFlutter并没有DatePicker这个控件,需要使用showDatePicker方法弹出日期选择控件,基本用法如…

权威发布 鸿蒙涅槃,鸿蒙涅槃 曾圣《鸿蒙》雕塑走进河北美院受追捧

原标题:鸿蒙涅槃 曾圣《鸿蒙》雕塑走进河北美院受追捧2019年10月20日上午10时曾圣《鸿蒙》雕塑作品展——暨河北美院首场新闻媒体发布会在河北美术学院雕塑院举办。河北美术学院校长甄忠义、河北美术学院党委书记高国忠、常务副校长张建敏、党委副书记甄心恒、副校长…

Rube GoldbergSpring整合

Spring Integration为集成系统所涉及的某些复杂性提供了非常好的抽象-Spring Integration从Integration的角度来看非常适合Facade的定义-简化了对复杂底层系统的访问。 为了说明这一点,请考虑一个简单的系统,该系统仅接收一条消息,然后将其发…

java ajax html复选框,HTMLjavaSkcriptCSSjQueryajax(九)(示例代码)

一、HTML1、单选按钮 Male Female2、复选框 I have a Car3、下拉列表 VoloFita如果设置某项选定直接 fem4、设置文本域 创建按钮 5、Runnob.com因为a 标签的target属性名是inframe_a的iframe框架,点击链接后页面会在iframe 中出现。6、脚本 JavaScript …

管理Jenkins作业配置

在JBoss工具和Developer Studio中,我们在Jenkins中管理许多构建作业。 实际上,对于3.2.x / 4.x和3.3.x / 5.x流,有195个以上的作业。 当我们开始建立明年的第一个里程碑时,我们将再产生40多个工作岗位。 这里是其中的一些&#xf…

Redis命令拾遗三(列表List类型)

本文版权归博客园和作者吴双本人共同所有。转载和爬虫请注明原文地址 Redis五种数据类型之列表类型Redis五种数据类型之列表类型。你可以存储一个有序的字符串列表一类数据。比如你想展示你所存储的所有文章中的前十条,当分页取下一页的时候,你也可以取接…

计算机桌面上的声音图标没了怎么办,电脑声音图标不见了怎么办超详细教程

我们在用电脑或者平板看视频、听歌的时候,如果声音不合适,大了或小了就会调节音量,除了可以选择设备自带的外部音量大小调节按键外,还可以用自带的声音图标来调节,而屏幕上的声音图标是最方便的。如果屏幕上的声音图标…

XML解组基准:JAXB,STAx,Woodstox

介绍 上周末,我开始考虑如何以一种资源友好的方式处理大量XML数据。我要解决的主要问题是如何以块的形式处理大型XML文件,同时提供上游/下游系统,需要处理一些数据。 当然,我已经使用JAXB技术已有几年了。 使用JAXB的主要优点是可…

ArcGIS空间分析工具

1. 3D分析 1.1. 3D Features toolset 工具 工具 描述 3D Features toolset (3D 要素工具集) Add Z Information 添加 Z 信息 添加关于具有 Z 值的要素类中的要素的高程属性的信息。 Buffer 3D 3D 缓冲 围绕点或线创建三维缓冲区以生成球形或圆柱形的多面…

计算机科学家和心理学家合作,生物智能与人工智能之间的合作

李飞飞带领的斯坦福“以人为本AI研究院”发表文章,探讨人工智能、神经科学、心理学和认知科学,以及数学、物理和社会科学等学科过去是怎样、以及未来将如何共同合作,追求对理解和创造智能系统的探索。最初的类人智能出现在几百万年前的非洲大…

JavaOne 2012 – 2400小时! 一些建议

您可能已经看到JavaOne 2012 Content Catalog在线。 计划委员会经过数周的艰苦工作,对每个提案进行了分类,审查,评分和讨论,我们终于为您设置了(希望如此)有趣的组合。 整整105天或2400个小时,我…

STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

Ⅰ、写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件、硬件)I2C主机控制从机EEPROM的例子。在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信。但在实际项目中作为I2C从机的应用相…

JavaFX 2:创建登录表单

在本教程中,我将使用JavaFX 2和CSS设计漂亮的Login Form 。 它是经典的登录表单,带有用户名和密码以及登录按钮。 为了遵循本教程,我强烈建议您查看以下这些教程: Eclipse IDE中的JavaFX 2入门 JavaFX 2:HBox JavaFX…

怎么解决tomcat占用8080端口问题

怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.The server may already be running in…

页面传值的方法 和JSON与字符串和对象之间的转换

json数据解析 就是将json转换为数组或对象 json数据序列化 就是将数组或对象转化为json转载于:https://www.cnblogs.com/yaomengli/p/6678709.html

JasperReports JSF插件用例系列

这是文章系列的切入点,在该系列文章中,我将尝试介绍JasperReport JSF Plugin的一些用例, JasperReport JSF Plugin是一种工具,旨在轻松地将为JasperReports设计的业务报告集成到JSF应用程序中。 该系列中描述的所有示例都可以从Ja…

回归分析

一元线性回归模型: 一元线性回归分析的主要任务是: 解得: 三、检验、预测与控制: 1)F检验法: 2)t检验法 3)r检验法 3预测: 四、可线性化的一元非线性回归(曲线…

与传统的计算机硬件系统相比,计算机一级名词解释

目前微型机中普遍采用的字符编码是ASCII码。它是用7位二进制数对127个字符进行编码,其中前32个是一些不可打印的控制符号。多媒体系统由主机硬件系统、多媒体数字化外部设备和多媒体软件三部分组成。机器语言和汇编语言都是"低级"的语言,而高级…