idea 不能及时编译_您是否能及时编译?

idea 不能及时编译

还记得上次被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

idea 不能及时编译

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

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

相关文章

接口开发-导读

接下来的这个系列,完全针对“APP接口”开发进行,所以,希望你有一定的Java开发基础、以及一定的接口交互经验。 思来想去,决定按照下面的提纲进行 1. 基于SpringBoot创建基础框架; 2. 集成数据库操作(mybati…

安装mysql显示有5.0_安装MySQL5.0时到如图这一步提示出错了,~

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

WinDbg配置和使用基础

WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。 1. WinDbg介绍: Debugging Tools and Symbols: Getting Started http://www.microsoft.com/whdc/devtools/d…

将Wiremock集成到Spring Boot Java Web应用程序中以模拟外部依赖关系

介绍 WireMock是用于基于HTTP的API的模拟服务器。 有些人可能会将其视为服务虚拟化工具或模拟服务器。 它使您能够存根所需的API或其他外部依赖项,以加快本地开发速度。 它支持测试真实API无法可靠产生的极端情况和失败模式。 在模拟单元测试和集成测试中的外部依赖…

windows下node安装

1.首先到node官网进行下载 下载页面中windows版本分两种,这里我们选择.msi进行安装(.zip是免安装的,但需要单独配置环境变量使用) 2.安装过程如下所示 这里可以更改安装的路径 这里默认会将node和npm加到环境变量中 3.验证安装 安…

tab键的转义字符_Python转义字符及用法

在《Python字符串》一节中我们曾提到过转义字符,就是那些以反斜杠\开头的字符。ASCII 编码为每个字符都分配了唯一的编号,称为编码值。在 Python 中,一个 ASCII 字符除了可以用它的实体(也就是真正的字符)表示,还可以用它的编码值表示。这种使用编码值来间接地表示字符的方…

CentOS中通过NAT连接网络

讲正文之前,推荐一个连接:http://wuxinaiaman928.blog.163.com/blog/static/64932144200811911233198/ 里面比较详细的介绍了Vmware中三种不同的连接方式:桥连接,NAT,使用主机网络,有助于理解简单来讲&…

serialport通过usb通讯_IOT串口通讯-RS232/RS485

串口串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等…

【项目管理和构建】——Maven下载、安装和配置(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[] 前言 在上篇博文【项目管理和构建】——Maven简介(一)中我们了解到maven是一种全新的项目构建方式,让我们的开发更加简单,高效。Maven主要做的是两件事…

mapreduce 算法_MapReduce算法–顺序反转

mapreduce 算法这篇文章是介绍MapReduce算法的系列文章的另一部分,该书在使用MapReduce进行数据密集型文本处理中找到。 先前的文章是Local Aggregation , Local Aggregation PartII和创建共现矩阵 。 这次我们将讨论阶数反转模式。 顺序反转模式利用的M…

lamp mysql开启命令_mysql lamp 配置命令总结

[email protected] ~]# chown -R mysql:mysql /usr/local/mysql (注:更改MySQL安装目录属主,属组)[[email protected] mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf (注:复制MySQL配置文件)[[email protected] mysql-5.5.22]#…

算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述

细化时间复杂度分析 代码千千万,有些代码逻辑会很复杂,所以为了更细化的分析算法的复杂度,再复杂度分析方面引入了4个知识点: 1.最好情况时间复杂度(best case time complexity)。 2.最坏情况时间复杂度&am…

梦想成真…教学–专业的Java开发人员:工具和最佳实践

我总是喜欢分享知识。 我写博客的原因之一是分享我在软件工程师方面的知识。 创立并运行(与几个朋友一起)第一个 早在2003年, 希腊的Java用户组就是由于我们在工作中得不到足够的培训或个人开发机会,因此我们希望共享和重用我们作…

arachni web mysql数据库_Web安全扫描工具Arachni

Arachni是一个多功能、模块化、高性能的Ruby框架,旨在帮助渗透测试人员和管理员评估web应用程序的安全性。同时Arachni开源免费,可安装在windows、linux以及mac系统上,并且可导出评估报告。一、Arachni下载与启动,以LInux环境为例…

tomcat - 报错 No such device; No faulty members identified.

启动tomcat集群的时候出现以下报错,导致集群没办法启动: java.net.SocketException: No such device; No faulty members identified. SEVERE: Unable to start cluster. org.apache.catalina.tribes.ChannelException: java.net.SocketException: No su…

设计模式09----门面设计模式

转自:https://www.cnblogs.com/lthIU/p/5860607.html 针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下。 一、概念介绍 外观模式(Facade),他隐藏了系统的复杂性&#xff0…

mysql 匿名块_MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的,与MSSQL或者Oracle的存储过程相比,如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容…

Tomcat集群和Session共享的配置方法

Tomcat集群配置其实很简单,在Tomcat自带的文档中有详细的说明( /docs/cluster-howto.html ),只不过是英语的,对我这样的人来说很难懂 。 下面根据说下怎么配置吧: 第一步、准备工作: 准备几份Tomcat程序&#xff0c…

Python:GUI Tkinter

GUI编程 GUI编程(Graphical User Interface Programming)指的是用于创建图形用户界面的程序设计。这种界面采用图形方式显示信息,让用户可以通过图形化的方式与程序进行交互,而不是仅仅通过文本命令。GUI编程使得软件更加直观易用…

jenkins配置工程目录-启动case

1.我们在python里面编辑的脚本可以正常跑,但是在cmd里面跑就不行了,找不到自己定义的方法模块,这个时候我们要搞个环境变量 name : PYTHONPATH val : 工程目录路劲如: D:python\test 这个时候我们再次cmd运行发现可以运行了…