JIT实现的几点考虑.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JIT实现的几点考虑 幡^程虎 中科盹轼件所北京lo0080 co·ix熏坑J·v-直|9c机coJ-v-为背晕讨诗了儿T嘉现中的一璺^体方浩和技巧 ■一I奉文【;I 关t一-儿T ’ §l总体流程 CoJm虚拟机有以下几个特点t 1. 采用纯用户级线程,由虚拟机内部实现 2. 采用保守式增量无用单元回收策略 3. 量大黻地保证可移植性,包括JIlr模块 尽管Jrr的具体实现比较复杂,但从总体流程来看非常简单。大致是一个顺序的过程: (1)髓定字节码÷∞字节码验证÷(3阚译成四元式÷(4)生成机器代码÷(5)修补机器 代码÷(6)解锁字节码 步疆2主要是保证字节码的静态约束和结构约束,同时划分基本块;步骤3将字节码翻 译到四元时.四元式是翻译的中间代码,使整个过程更清晰简单,但也带来了性l毙的损失: 步翼4根据四元时生成机器代码,但其中存在一些未定因素.如跳转地址等;步骤5修补机 器代码中的未定数据。 . 限于篇幅,本文仅零散地讨论一些实现要点和想法。关于寄存器分配本文也不作讨论, 因为coJmJIT中仅简单地采用基于基本块的最近最少使用法分配寄存器.更复杂的图作色 算法等优化策略请参见相关文章。 §2实现考虑 在Jrr的实现中.为动态机器代码分配空间的方式可以是两种; 1. 使用mm蚴配 2.使用mmpo映射虚存空间 删瑚p0属于系统调用,而棚d1∞O属于c语育标准的库函数lnⅪ.由l抛c提供的mall∞陆∞ 西数篪使用一套自己的堆空阃分配体系,但它从系统得到原始堆空I可则是遥过系统调用酬co 获得的.从擐作系统实现的角度上看.Ⅻ的实际上也是遇过咖印O来实现自己的功能.根 据P(喀Ⅸ标准,由删珊p0分配的用户堆空间同时具有读、写和执行三种权限.园此。我们 可以简单地使用删Ill∞0来为Jrr分配内存. §2.2 复杂摄作的翻译 这是一点小技巧.有时候翻译的目标语义动作非常复杂,而且过程冗长,直接翻译可能 ·l●1· 比较困难。此时可以将它写成一个函数,作为虚拟机本身的~部分,在翻译的目标代码中只 需生成对该函数的调用就可以了。也就是说,将繁杂的翻译工作交给c编译器去傲,而不 是即时编译器。但这需要权衡一下所谓的复杂性:因为用函数方式实现翻译会降低执行效能. 但节约空间;而直接翻译虽然占用空间太但速度根快。在i386芯片上尤其如此。 璺2.3 关于四元式的总体考虑 四元式的设计是JIT的中心问题。四元式类似于静态编译中的中间语言。因为Java字 节码和i386机器代码是面向完全不同的计算体系结构.它{『,之间存在着巨大的差异.所以 设计四元式的目的就是抽取两者的共同点,弥补两者之间的差异.为到机器指令的翻译搭起 一座桥梁。i386指夸集中不存在三操作数的指令,所以如果采用三元式作为中间语言也是 可以的。之所以采用四元式是因为这样做更加灵话.并且并没有损失什么性能. 我们设计的四元式包括:目的操作数、源操作数l、源操作数2、语义动作。这是四元 式的基本组成部分。现在来考虑这些操作数地址。在Java字节码规范中规定的操作数包括: 常数池索引、局部变量索引、栈变量索引(通过隐含的方式)、立即数。其中每种操作数的 都可咀有多种类型。比如常数池索引,既可以是jlong类型的常数,又可以是域索引,或是 方法签名等等。 再看看i386指令的操作数,包括:寄存器、内存地址、立即数。它们都是没有类型的, 只有长度的区别,分8位,16位和32位三种。一般使用32位操作数。 立即数的翻译是简单的,冈为i386指令直接支持立即数。对于常数池索引.基本可直 接映射到相应的内存虚拟地址。因为常数池中的项目所指的数据不是某类的静态变量就是目 对象的域交量,或者某方法,某字符串,菜常数等,它船在虚拟机运行起来后就具有静态的 内存地址,因为它们本屐j部是庄虚:盟机罐中动态分配的,在生存期不会发生改变。所以可 以直接经用i38‘指令中自i出存地址操作数。对!F局部变量和栈变量则需要仔细的讨论。 局部变量和棱变量其实可以统一看待。它们都是由Java虚拟机定义的运行时临时数据 存储空间。虚

文档评论(0)

bhl0572 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档