您是否能及时编译?

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

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

在深入解释“即时”编译技巧之前,让我们深入了解一下背景知识。

您可能还记得– Java是一种解释型语言。 大多数用户都知道的Java编译器javac不会像C编译器那样直接将Java源文件编译为处理器指令。 而是生成字节码,这是由规范控制的与机器无关的二进制格式。 JVM在运行时解释该字节码。这是Java在跨平台上如此成功的主要原因-您可以在一个平台上编写和构建程序,然后在其他平台上运行。 Just in Time 另一方面,它确实引入了一些负面方面。 其中最严重的事实之一是,解释的代码通常比直接编译为平台特定的本机二进制代码的代码要慢。 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

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

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

相关文章

2d物理引擎01

我一直想做一个游戏&#xff0c;但一直感觉自己水平不够 想了想觉得不去做的话就永远做不出来 所以有了这个博文 01 我需要一个东西来显示&#xff0c;很显然h5中canvas是很好的选择 <!DOCTYPE html> <html><head><meta charset"utf-8" />&l…

Liferay Model Hints

这篇文章主要介绍如何通过model hint 来修改liferay builder service生成数据库表中默认字段的长度。 1.什么是Model Hints? 它是对liferay builder service生成的model类的基本提示. 2. 它在什么地方被定义的&#xff1f; portlet-model-hints.xml 3. 文件位置&#xff1f; /…

浏览器书签备份管理

1、火狐浏览器备份导出HTML文件&#xff1a; CtrlJ 书签 - 导入/导出 2、谷歌浏览器&#xff1a; 设置中 导入书签 转载于:https://www.cnblogs.com/AmbiguousMiao/p/8084721.html

选择您的收藏库

这真的是您应该烦恼的吗&#xff1f; java.util.ArrayList和java.util.HashMap从根本上有问题吗&#xff1f; 对于大多数源代码&#xff0c;答案是–不&#xff1b; 这些实现完全可以。 但是&#xff0c;一如既往&#xff0c;细节决定成败。 并存在情况下&#xff0c;当是内置…

里公式后面标号怎么对齐_你若会用Word里F4键,又何须加班到半夜?

F4键在Word里面表示重复上一个操作&#xff0c;但对于这个快捷键&#xff0c;你真的会操作吗&#xff1f;本期与大家分享这个神奇的F4键&#xff0c;助你高效工作。1、批量复制文本在一般情况下&#xff0c;我们是用CtrlC复制内容&#xff0c;CtrlV粘贴内容&#xff0c;但遇到特…

DshanMCU-R128s2 SDK 架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC&#xff0c;同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文档作为 R128 FreeRTOS SDK 开发指南&#xff0c;旨在帮助软件开发工程师、技术支持工程师快速上手&am…

数据导出

数据导出和数据导入刚好是相反的&#xff0c;把逻辑反过来就可以了。 源码&#xff1a;https://github.com/SeaLee02/FunctionModule/blob/master/UploadFiles/WebDemo/COM/DataToOut.aspx 效果&#xff1a; 然后勾选需要导出的数据&#xff0c;生成Excel 部分前台&#xff1a;…

spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战

一、事务传播性1.1 什么是事务的传播性事务的传播性一般在事务嵌套时候使用&#xff0c;比如在事务A里面调用了另外一个使用事务的方法&#xff0c;那么这俩个事务是各自作为独立的事务执行提交&#xff0c;还是内层的事务合并到外层的事务一块提交那&#xff0c;这就是事务传播…

前端为什么非要动静分离 说一下CDN托管的意义

大型Web应用对速度的追求并没有止步于仅仅利用浏览器缓存&#xff0c;因为浏览器缓存始终只是为了提升二次访问的速度&#xff0c;对于首次访问的加速&#xff0c;我们需要从网络层面进行优化&#xff0c;最常见的手段就是CDN&#xff08;Content Delivery Network&#xff0c;…

CSS position(定位)属性

关于CSS position&#xff0c;来自MDN的描述&#xff1a; CSS position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left 属性则决定了该元素的最终位置。 然后来看看什么是文档流(normal flow)&#xff0c;下面是 www.w3.org 的描述&#xff1a; Normal flo…

Java ByteBuffer –速成课程

以我的经验&#xff0c;当开发人员第一次遇到java.nio.ByteBuffer时&#xff0c;会引起混乱和细微的错误&#xff0c;因为如何正确使用它尚不明显。 在我对API文档感到满意之前&#xff0c;需要反复阅读API文档和一些经验以实现一些微妙之处。 这篇文章是关于如何正确使用它们的…

实现编辑功能有哪几个action_Web 应用的撤销重做实现

背景前不久&#xff0c;我参与开发了团队中的一个 web 应用&#xff0c;其中的一个页面操作如下图所示&#xff1a;GIF这个制作间页面有着类似 PPT 的交互&#xff1a;从左侧的工具栏中选择元素放入中间的画布、在画布中可以删除、操作&#xff08;拖动、缩放、旋转等&#xff…

windows下如何安装pip以及如何查看pip是否已经安装成功?

最近刚学习python&#xff0c;发现很多关于安装以及查看pip是否安装成的例子都比较老&#xff0c;不太适合于现在&#xff08;python 3.6 &#xff09;因此&#xff0c;下一个入门级别的教程。 0&#xff1a;首先如何安装python我就不做介绍了。 1&#xff1a;如果安装的是pyth…

检查用户显示器的分辨率

检查用户显示器的分辨率 转载于:https://www.cnblogs.com/Renyi-Fan/p/8088012.html

android 字体 dpi,详解Android开发中常用的 DPI / DP / SP

Android的碎片化已经被喷了好多年&#xff0c;随着国内手机厂商的崛起&#xff0c;碎片化也越来越严重&#xff0c;根据OpenSignal的最新调查&#xff0c;2014年市面上有18796种不同的Android设备&#xff0c;作为开发者&#xff0c;一个无法回避的难题就是需要适配各种各样奇奇…

android studio闪退代码不报错_代码不报错,不代表真的没错

今天是生信星球陪你的第695天大神一句话&#xff0c;菜鸟跑半年。我不是大神&#xff0c;但我可以缩短你走弯路的半年~就像歌儿唱的那样&#xff0c;如果你不知道该往哪儿走&#xff0c;就留在这学点生信好不好~这里有豆豆和花花的学习历程&#xff0c;从新手到进阶&#xff0c…

Centos7操作系统部署指南

一、硬件环境&#xff1a; Dell R620 二、软件环境&#xff1a; Centos6.4 X86_64 KVM Windows7vnc 三、安装说明 操作系统更新之迅速&#xff0c;让作为新手的系统运维人员有点措手不及&#xff0c;相对于老手就胸有成竹。怎么讲&#xff1f;由于老手对技术方向把握的非常好&…

Eclipse插件中的SLF4J登录

一直都在使用Maven和纯Java库进行开发&#xff0c;我从没想过在开发Eclipse插件时发出一些日志语句可能会成为问题。 但是&#xff0c;在Eclipse开发人员的想象中&#xff0c;一切似乎总是在Eclipse环境中&#xff0c;而Eclipse宇宙之外则什么都没有。 如果您使用Google搜索上…

Java EE 7社区调查结果!

在JSR 342下可以继续进行Java EE 7的工作。一切进展顺利&#xff0c;Java EE 7现在处于“初稿审查”阶段。 在11月初&#xff0c; Oracle发布了一个有关即将推出的Java EE 7功能的小型社区调查 。 昨天结果公布了。 超过1,100名开发人员参加了调查&#xff0c;并且几乎对每个问…

CSS(三)

CSS盒子模型 盒子模型解释 元素在页面中显示成一个方块&#xff0c;类似一个盒子&#xff0c;CSS盒子模型就是使用现实中盒子来做比喻&#xff0c;帮助我们设置元素对应的样式。盒子模型示意图如下&#xff1a; 把元素叫做盒子&#xff0c;设置对应的样式分别为&#xff1a;盒…