jit编译器

java解释执行和编译执行

匿名 (未验证) 提交于 2019-12-02 21:35:18
解释执行:将编译好的字节码一行一行地翻译为机器码执行。 编译执行:以方法为单位,将字节码一次性翻译为机器码后执行。 前者的优势在于不用等待,后者则在实际运行当中效率更高。 为了满足不同的场景,HotSpot虚拟机内置了多个即时编译器:C1,C2与Graal。 C1:即Client编译器,面向对启动性能有要求的客户端GUI程序,采用的优化手段比较简单,因此编译的时间较短。 C2:即Server编译器,面向对性能峰值有要求的服务端程序,采用的优化手段复杂,因此编译时间长,但是在运行过程中性能更好。   从Java7开始,HotSpot虚拟机默认采用分层编译的方式:热点方法首先被C1编译器编译,而后 热点方法中的热点再进一步被C2编译(理解为二次编译,根据前面的运行计算出更优的编译优化)。为了不干扰程序的正常运行,JIT编译时放在额外的线程中执行的,HotSpot根据实际CPU的资源,以1:2的比例分配给C1和C2线程数。在计算机资源充足的情况,字节码的解释运行和编译运行时可以同时进行,编译执行完后的机器码会在下次调用该方法时启动,已替换原本的解释执行(意思就是已经翻译出效率更高的机器码,自然替换原来的相对低效率执行的方法)。 JIT编译: 现在主流的商用虚拟机(如Sun HotSpot、IBM J9)中几乎都同时包含解释器和编译器(三大商用虚拟机之一的 JRockit 是个例外

Java虚拟机:源码到机器码

▼魔方 西西 提交于 2019-12-01 19:51:00
目录 前端编译器:源代码到字节码 JIT编译器:从字节码到机器码 AOT编译器:源代码到机器码 总结 转载 无论什么语言写的代码,其到最后都是通过机器码运行的,无一例外。那么对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?这就是今天我们要聊的。 如下图所示,编译器可以分为:前端编译器、JIT 编译器和AOT编译器。下面我们逐个讲解。 前端编译器:源代码到字节码 对于 Java 虚拟机来说,其实际输入的是字节码文件,而不是 Java 文件。那么对于 Java 语言而言,其实怎么将 Java 代码转化成字节码文件的呢?我们知道在 JDK 的安装目录里有一个 javac 工具,就是它将 Java 代码翻译成字节码,这个工具我们叫做编译器。相对于后面要讲的其他编译器,其因为处于编译的前期,因此又被称为前端编译器。 我们运行 javac 命令的过程,其实就是 javac 编译器解析 Java 源代码,并生成字节码文件的过程。说白了,其实就是使用 javac 编译器把 Java 语言规范转化为字节码语言规范。javac 编译器的处理过程可以分为下面四个阶段: 第一个阶段:词法、语法分析。在这个阶段,JVM 会对源代码的字符进行一次扫描,最终生成一个抽象的语法树。简单地说,在这个阶段 JVM 会搞懂我们的代码到底想要干嘛。就像我们分析一个句子一样,我们会对句子划分主谓宾

jit编译

和自甴很熟 提交于 2019-12-01 07:29:42
热点代码: 虚拟机中的字节码(.class文件内容)是由解释器( Interpreter )完成编译的,当虚拟机发现某个方法或代码块的运行特别频繁的时候,就会把这些代码认定为“热点代码”。 什么是jit编译: 为了提高热点代码的执行效率,在运行时,即时编译器(JIT)会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化,然后保存到内存中。 在 HotSpot 虚拟机中,内置了两个 JIT,分别为 C1 编译器和 C2 编译器,这两个编译器的编译过程是不一样的。 C1 编译器是一个简单快速的编译器,主要的关注点在于局部性的优化,适用于执行时间较短或对启动性能有要求的程序,例如,GUI 应用对界面启动速度就有一定要求。 C2 编译器是为长期运行的服务器端应用程序做性能调优的编译器,适用于执行时间较长或对峰值性能有要求的程序。根据各自的适配性,这两种即时编译也被称为 Client Compiler 和 Server Compiler。 如何探测代码为热点代码: 热点探测是基于计数器的热点探测,采用这种方法的虚拟机会为每个方法建立计数器统计方法的执行次数,如果执行次数超过一定的阈值就认为它是“热点方法”。 虚拟机为每个方法准备了两类计数器:方法调用计数器(Invocation Counter)和回边计数器(Back Edge Counter;在程序中遇到控制流向后跳转的指令称为

JVM性能优化, Part 2 ―― 编译器

巧了我就是萌 提交于 2019-11-30 07:05:15
ImportNew注:本文是JVM性能优化 – 第2篇 《JVM性能优化, Part 2 ―― 编译器》第一篇 《JVM性能优化, Part 1 ―― JVM简介 》 作为JVM性能优化系列文章的第2篇,本文将着重介绍Java编译器,此外还将对JIT编译器常用的一些优化措施进行讨论(参见“JVM性能优化,Part 1″中对JVM的介绍)。Eva Andreasson将对不同种类的编译器做介绍,并比较客户端、服务器端和层次编译产生的编译结果在性能上的区别,此外将对通用的JVM优化做介绍,包括死代码剔除、内联以及循环优化。 Java编译器存在是Java编程语言能独立于平台的根本原因。软件开发者可以尽全力编写程序,然后由Java编译器将源代码编译为针对于特定平台的高效、可运行的代码。不同类型的编译器适合于不同应用程序的需求,使编译结果可以满足期望的性能要求。对编译器基本原理了解得越多,在优化Java应用程序性能时就越能得心应手。 什么是编译器 简单来说,编译器就是将一种编程语言作为输入,输出另一种可执行语言的工具。大家都熟悉的javac就是一个编译器,所有标准版的JDK中都带有这个工具。javac以Java源代码作为输入,将其翻译为可由JVM执行的字节码。翻译后的字节码存储在.class文件中,在启动Java进程的时候,被载入到Java运行时中。 标准CPU并不能识别字节码

JVM性能优化, Part 1 ―― JVM简介

浪子不回头ぞ 提交于 2019-11-29 05:27:05
众所周知,Java应用程序是运行在JVM上的,但是你对JVM有所了解么?作为这个系列文章的第一篇,本文将对经典Java虚拟机的运行机制做简单介绍,内容包括“一次编写,到处运行”的利弊、垃圾回收的基本原理、常用垃圾回收算法的示例和编译器优化等。后续的系列文章将会JVM性能优化的内容进行介绍,包括新一代JVM的设计思路,以及如何支持当今Java应用程序对高性能和高扩展性的要求。 如果你是一名程序员,那么毫无疑问,你肯定有过某种兴奋的感觉,就像是当一束灵感之光照亮了你思考方向,又像是神经元最终建立连接,又像是你解放思想开拓了新的局面。就我个人来说,我喜欢这种学习新知识的感觉。我在工作时就常常会有这种感觉,我的工作会涉及到一些JVM的相关技术,这着实令我兴奋,尤其是工作涉及到垃圾回收和JVM性能优化的时候。在这个系列中,我希望可以与你分享一些这方面的经验,希望你也会像我一样热爱JVM相关技术。 这个系列文章主要面向那些想要裂解JVM底层运行原理的Java程序员。文章立足于较高的层面展开讨论,内容涉及到垃圾回收和在不影响应用程序运行的情况下对安全快速的释放/分配内存。你将对JVM的核心模块有所了解:垃圾回收、GC算法、编译器行为,以及一些常用优化技巧。此外,还会讨论为什么对Java做基准测试(benchmark)是件很困难的事,并提供一些建议来帮助做基准测试。最后

漫话:如何给女朋友解释鸿蒙OS是怎样实现跨平台的?

两盒软妹~` 提交于 2019-11-28 17:14:10
周末在家休息,女朋友在刷朋友圈,突然她问我: 鸿蒙OS回顾 2019年8月9日华为开发者大会上,华为消费者业务CEO余承东正式宣布发布自有操作系统鸿蒙,内核为Linux内核、鸿蒙微内核和LiteOS。未来将摆脱Linux内核和LiteOS,只有鸿蒙微内核。 鸿蒙(英语:Harmony OS,开发代号Ark)是华为自2012年开发的一款可能兼容Android app的跨平台操作系统。 图:鸿蒙OS的四大技术特性 1.分布式架构首次用于终端OS,实现跨终端无缝协同体验 2. 确定时延引擎和高性能IPC技术实现系统天生流畅 3. 基于微内核架构重塑终端设备可信安全 4. 通过统一IDE支撑一次开发,多端部署,实现跨终端生态共享 什么是跨平台 在以前, 平台 ≈ 操作系统 。所以,传统意义上的跨平台即不依赖于操作系统,也不依赖硬件环境。一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。 但是随着科技的发展, 平台 ≈ 操作系统 已经不成立了,就像华为推出的鸿蒙OS,他可以支持到多种多样的设备,如手机、手表、电脑、汽车、智能家居设备等。 所以,今天我们谈的跨平台,指的是跨设备。即 平台 ≈ 设备 所以,华为希望鸿蒙OS可以运行在各种各样的设备上,所以,鸿蒙OS必然需要具备跨平台的能力。 而且,鸿蒙想要做的不仅仅是操作系统可以跨平台,更重要的是要让用户和开发者真正的感受到跨平台。

CLR基础

自作多情 提交于 2019-11-28 00:36:06
读《CLR via C# 》之后感觉对.net 的理解有了一个飞跃(虽然大部分内容还要慢慢消化和吸收),对CLR,JIT编译器,垃圾回收,多线程使用,和锁等概念都有了更深的认识。我从四月末开始看,直到八月初才看完,有几节跳过了,像WinRT 觉得过时了就没看,毕竟Microsoft 目前大力推广.net core。能让我坚持看完的原因很大一部分是作者 Jeffrey 的文字平易近人,描述细腻,让人感觉作者确实是想把毕生所学倾囊相授。就像译者周靖在结尾评价的那样:"字里行间,全是殷勤叮嘱。无浮夸之文字,倾心血而写就"。 以后我将逐步整理看完此书的习得,也是对书中难理解的地方做一下回顾。 第一篇 CLR 基础 1 将源代码编译成托管模块 公共语言运行时(Common Language Runtime ,CLR) 是一个可由多种编程语言使用的“运行时”。CLR的核心功能(比如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。 只要编译器是面向CLR的,可以用任何语言编译出托管模块。 托管模块 是标准的32位Microsoft Windows 可移植执行体(PE32)文件,或者是标准的64位Windows可移植执行体(PE32+)文件,它们都需要CLR才能执行。 元数据: 每个托管模块都包含元数据表,主要有两种表:一种表描述源代码种定义的类型和成员

JIT晚期(运行期)

不羁的心 提交于 2019-11-27 07:35:43
1. Java的编译和执行 编译 包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行 也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释和编译执行的区别是: 是否产生中间本地机器码。 即时编译生成机器相关的中间码,可重复执行缓存效率高。解释执行直接执行字节码,重复执行需要重复解释。 2. 编译原理 在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽象语法树。 其中绿色的模块可以选择性实现。 上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript), 而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程。 对于一门具体语言的实现来说: 词法和语法分析乃至后面的优化器和目标代码生成器都可以选择独立于执行引擎,形成一个完整意义的编译器去实现,这类代表是C/C++语言。 也可以把抽象语法树或指令流之前的步骤实现一个半独立的编译器,这类代表是Java语言。 又或者可以把这些步骤和执行引擎全部集中在一起实现,如大多数的JavaScript执行器。 3. 三个编译器 JVM的编译器可以分为三个编译器: ( 1) 前端编译器 : 把.java转变为.class的过程 。如Sun的 Javac 、Eclipse JDT中的增量式编译器( ECJ )。 ( 2) 后端编译器