基于方法的JIT编译之挑战

今天,混合模式的编译系统采用的常用方法是识别频繁执行的或者叫热方法。热方法传递给JIT编译器以便编译成机器代码。然后,当解释器看见应用调用被编译过的方法时,它就会分发机器代码去执行。

这种面向方法的方法已经采用许多年了,但是仍然需要大量的开发方面的前期投资。直到能够编译一门语言中出现的所有功能时,这样的系统才能提高方法的执行效率。对重要的应用来说,这需要JIT编译整个语言,包含那些复杂的已经用高级虚拟指令体实现了的功能,例如那些方法调用,对象创建,异常处理。

1 Compiling Cold Code

因为一个方法被频繁执行,并不意味着方法内的所有指令也会频繁执行。实际上,热方法的部分区域可能是“冷的”,也就是说可能他们永远也不会执行。编译冷代码除了浪费时间外还有更多的隐含意味。除最高级别的优化外,分析冷代码可以证明哪些是热代码,除了这一点好除外,没有其他更多益处。一个更严重的问题是,冷代码增加了动态编译的复杂度。我们给出3个例子。

首先,对于延迟绑定语言如Java来说,冷代码很有可能包含对那些还没有绑定的外部符号的引用,因此当冷代码最终并没有运行时,生成的代码还有支持它运行的环境(Runtime)必须处理延迟绑定的复杂性。

第二,某些动态优化如果不运行Profiling信息是不可能做到的. Foremost amongst these is the optimization of virtual function calls. 因此没有Profiling信息,JIT只能为冷代码生成相对慢的保守代码。这个问题对弱类型(runtime typed)的语言如python来说变得更加重要,因为虚拟指令的操作数类型可能只有在运行时刻才能知道。没有运行信息,无论是动态还是静态的Python编译器都不能判别简单算数运算如加法的操作数是什么类型,是整形、浮点型还是字符串型。

第三,随着指令的执行,编译过的方法里以前认为冷的区域可能变热。第一次编译是作出的保守的假设现在对性能却构成了拖累。直接的方法就是再次编译这些冷代码,这样做就会对编译带来的优势造成了损害。而且,问题是如此复杂以至于对那些还在方法中执行的线程来说,它们需要做什么?或者未来如何返回到方法?

时间: 2024-11-05 16:08:55

基于方法的JIT编译之挑战的相关文章

Javac编译和JIT编译

编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机.虚拟机等的语言,大多都遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽象

【深入Java虚拟机】之七:Javac编译与JIT编译

转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机

javac 编译与 JIT 编译

编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如 JavaScript),而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程. 如今,基于物理机.虚拟机等的语言,大多都遵循这种基于现代经典编译原理的思路,在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽

你的Java代码对JIT编译友好么?

JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中,我们将介绍一些简单的方法来验证你的程序是否对JIT友好.这里我们并不打算覆盖诸如JIT编译器工作原理这些细节.只是提供一些简单基础的检测和方法来帮助你的代码对JIT友好,进而得到优化. JIT编译的关键一点就是JVM会自动地监控正在被解释器执行的方法.一旦某个方法被视为频繁调用,这个方法就会被标记

你的java 代码对JIT编译友好吗?

JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中,我们将介绍一些简单的方法来验证你的程序是否对JIT友好.这里我们并不打算覆盖诸如JIT编译器工作原理这些细节.只是提供一些简单基础的检测和方法来帮助你的代码对JIT友好,进而得到优化. JIT编译的关键一点就是JVM会自动地监控正在被解释器执行的方法.一旦某个方法被视为频繁调用,这个方法就会被标记

jit编译

热点代码: 虚拟机中的字节码(.class文件内容)是由解释器( Interpreter )完成编译的,当虚拟机发现某个方法或代码块的运行特别频繁的时候,就会把这些代码认定为“热点代码”. 什么是jit编译: 为了提高热点代码的执行效率,在运行时,即时编译器(JIT)会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化,然后保存到内存中. 在 HotSpot 虚拟机中,内置了两个 JIT,分别为 C1 编译器和 C2 编译器,这两个编译器的编译过程是不一样的. C1 编译器是一个简单快速

jit编译原理

jit用以把程序全部或部分翻译成本地机器码,当需要装载某个类[通常是创建第一个对象时],编译器会先找到其.class文件,然后将该类的字节码装入内存. hotspot采用惰性评估法: 如果一段代码频繁的调用方法,或是一个循环,也就是这段代码被多次执行,JIT编译器会参与其中 而如果一个方法从来不被执行,则不会经过JIT编译 寄存器和主存 其中一个最重要的优化策略是编译器可以决定何时从主存取值,何时向寄存器存值.考虑下面这段代码: 清单 1. 主存 or 寄存器测试代码 1 2 3 4 5 6 7

JVM总括三-字节码、字节码指令、JIT编译执行

JVM总括三-字节码.字节码指令.JIT编译执行 java文件编译后的class文件,java跨平台的中间层,JVM通过对字节码的解释执行(执行模式,还有JIT编译执行,下面讲解),屏蔽对操作系统的依赖.一个字节(8位)可以储存256中不同的指令,这样的指令就是字节码,java所有指令有200个左右,这些指令组成了字节码文件(.class). 一.字节码的主要指令: .class文件里面的十六进制文件(如:图一),其中CAFE BABE是标志这个文件为java的编译后的文件,00000034代表

Spring Security应用开发(19)基于方法的授权(三)AOP

本文介绍使用AOP的配置方式来实现基于方法的授权. (1)首先使用Spring Security提供的protect-pointcut进行配置. protect-pointcut结点配置访问符合指定条件的方法锁需要的角色列表. <!-- 使用AOP的方式来定义方法级别的访问控制 --> <sec:global-method-security> <sec:protect-pointcut access="ROLE_USER,ROLE_ADMIN" expre