Java虚拟机的自适应动态优化

Java虚拟机的自适应动态优化

论文摘要

Java语言以其在软件工程上的优势而被广泛地应用在各个领域的软件开发中。Java程序运行在Java虚拟机这一动态环境下,和传统的静态编译的二进制代码相比,它存在很多优势:代码的可移植性、安全性、自动化的内存管理和线程管理技术、动态类加载等等。这些方便而又强大的功能大大提高程序员的工作效率,因此被广泛使用。但是,这些动态的特性使得一些传统的静态编译技术不再适用,因此科学家们一直在探索新的编译技术,使得在虚拟机上能够获得更好的性能。由于缺乏运行时信息,静态编译采用较为复杂的全局分析而并不能得到理想的结果。Java虚拟机的介入使得编译及优化发生在程序运行时,因此工业界一直致力于发展自适应优化技术,希望能够利用程序运行时的动态信息来指导对程序进行何种优化。围绕Java程序中现有局部性的问题及其对应用程序性能的影响,本文系统深入地研究了Java虚拟机中的自适应优化技术,其主要的创新点及贡献如下:第一,设计并实现了一种低开销的自适应动态优化框架。该框架通过插桩来收集细粒度的信息,在程序运行的过程中,我们会根据反馈的信息自适应地调整插桩以降低开销,同时为了进一步减少插桩带来的影响,我们从Java程序的特性出发,尽量减少插桩的数目。和以前的静态分析工作相比,我们的工作是在运行时进行的,摆脱了因数据集变化而带来的不灵活性,和已有的动态分析工作相比,我们首次在Java虚拟机中实现自适应动态优化框架,弥补了Java虚拟机中现有的动态编译技术的不足,同时为了降低框架的运行时开销,我们针对Java语言的特性对框架进行一系列优化,包括框架设计、访问对象的插桩设计等,这些技术有效地降低了开销,进一步提高了Java程序的性能。最终的实验结果表明自适应优化框架的开销最多为2.5%,平均为1.7%。该框架为后面提出的局部性优化创造了良好的条件。第二,提出一种快速的滑动标记缩并算法。它在标记阶段记录位图和存活块池,在缩并阶段计算块内偏移表,将对堆的遍历转化为对块内偏移表的访问,大大地降低遍历堆所带来的开销;同时活块池的引入使得该算法很容易被应用在并行垃圾收集算法中。实验证明该算法使得标准工业测试程序SpecJBB2005、SpecJVM98和Dacapo的性能有不同程度的提高,最高达到8.9%;同时程序的局部性也优于线性标记缩并算法,与深度遍历序相比,DTLB(Data Translation Lookaside Buffer)失效率改善最多为11%,2级Cache失效率改善最多为13.6%。第三,基于自适应动态优化框架提出预取优化算法来改善程序的局部性。该算法基于自适应动态优化框架,它在即时编译器对程序编译的同时完成插桩的工作,插桩用来收集访存对象的信息。如果检测到当前运行过程中存在相关对象的访问,预取控制器将会插入相应的预取指令。自适应预取优化算法的关键在于预取准确性和运行时开销之间的权衡。为了保证预取的准确性,我们对程序进行插桩;为了降低运行时的开销,我们控制预取指令的插入并且实现无效的插桩删除优化。实验结果表明该算法使得标准工业测试程序SpecJBB2005、SpecJVM98和Dacapo的性能有不同程度的提高,最高达到18.1%,平均为7.15%。同时,运行时开销低于4%,内存开销可以忽略不计。第四,描述了一种基于对象亲缘关系的垃圾收集算法。该算法通过硬件性能分析器来定位频繁引起Cache失效的对象,根据对象之间的亲缘关系,建立对象亲缘图,并与垃圾收集算法相结合,将亲缘度高的对象们排列在堆中相邻的位置,这意味着访问完其中一个对象,接下来访问另外一个对象的概率很高,将它们放在一起可以改善对象之间的局部性,实验结果表明基于对象亲缘关系的垃圾收集算法对SpecJBB2005、SpecJVM98和Dacapo的性能有明显的提高,最多为4.9%,平均为3.4%,同时采用硬件性能分析器收集信息使得profiling的开销很低,平均为0.47%,最后我们将该算法和自适应预取优化相结合,结果表明大部分程序的性能不会降低,对于个别程序,甚至有所提高。

论文目录

  • 摘要
  • Abstract
  • 目录
  • 第一章 绪论
  • 1.1 自适应优化技术
  • 1.1.1 选择性优化技术
  • 1.1.2 反馈指导优化的profiling技术
  • 1.1.3 反馈指导的代码生成技术
  • 1.1.4 其他的反馈指导优化技术
  • 1.2 Java虚拟机中的自适应动态优化
  • 1.2.1 Java语言及Java虚拟机简介
  • 1.2.2 Java虚拟机的发展趋势
  • 1.2.3 Java虚拟机中现有的自适应优化
  • 1.3 研究热点及相关工作
  • 1.4 本文的主要贡献
  • 1.5 论文的组织
  • 第二章 Java虚拟机中的自适应优化系统
  • 2.1 引言
  • 2.2 Java虚拟机
  • 2.2.1 Java虚拟机的基本结构
  • 2.2.2 字节码概述
  • 2.2.3 类装载器
  • 2.2.4 线程和同步支持机制
  • 2.2.5 即时编译器
  • 2.2.6 垃圾收集器
  • 2.3 Harmony VM简介
  • 2.4 性能评测程序简介
  • 2.4.1 SpecJBB2005基准测试程序
  • 2.4.2 SpecJVM98基准测试程序集
  • 2.4.3 Dacapo基测试程序集
  • 2.5 本章小结
  • 第三章 自适应动态优化框架
  • 3.1 引言
  • 3.2 相关工作
  • 3.3 自适应的动态优化
  • 3.3.1 Java语言中的对象访问
  • 3.3.2 自适应的动态优化框架
  • 3.4 运行时开销控制
  • 3.4.1 降低运行时开销
  • 3.4.2 对象访问判重
  • 3.4.3 数组对象访问判重
  • 3.5 性能评测与分析
  • 3.5.1 实验方法
  • 3.5.2 实验结果与分析
  • 3.6 本章小结
  • 第四章 快速的滑动标记缩并垃圾收集算法
  • 4.1 引言
  • 4.2 相关工作
  • 4.2.1 引用计数法
  • 4.2.2 标记清扫算法
  • 4.2.3 节点复制算法
  • 4.2.4 标记缩并算法
  • 4.2.5 分代垃圾收集算法
  • 4.2.6 不同遍历序之间的比较
  • 4.3 背景介绍
  • 4.3.1 DRLVM中的堆的组织形式
  • 4.3.2 传统的滑动标记缩并算法
  • 4.3.3 DRLVM中的滑动标记缩并算法
  • 4.4 快速的滑动标记缩并算法
  • 4.4.1 算法中使用的变量
  • 4.4.2 算法描述
  • 4.4.3 对访问MBT的优化
  • 4.4.4 三种滑动标记缩并算法的比较
  • 4.5 算法在并行化方面的延伸和拓展
  • 4.6 性能评测与分析
  • 4.6.1 算法评估
  • 4.6.2 算法的时间复杂度
  • 4.6.3 算法对局部性的影响
  • 4.6.4 多个GC线程带来的加速比
  • 4.7 本章小结
  • 第五章 基于自适应优化框架的动态预取算法
  • 5.1 引言
  • 5.2 相关工作
  • 5.2.1 预取分类
  • 5.2.2 相关工作
  • 5.3 预取控制器的设计
  • 5.3.1 预取优化的目标
  • 5.3.2 预取控制器所使用的数据结构
  • 5.3.3 预取指令的插入
  • 5.4 自适应动态预取优化算法
  • 5.4.1 自适应动态预取优化算法
  • 5.4.2 算法描述
  • 5.5 降低算法的开销
  • 5.5.1 消除冗余的预取指令
  • 5.5.2 循环展开优化
  • 5.5.3 无效插桩删除优化
  • 5.6 性能评测与分析
  • 5.6.1 性能的提升
  • 5.6.2 相关对象访问的分布
  • 5.6.3 数据Cache失效和数据TLB失效
  • 5.6.4 自适应动态预取优化算法的开销
  • 5.6.5 步长数组的分布
  • 5.7 本章小结
  • 第六章 基于对象亲缘关系的垃圾收集算法
  • 6.1 引言
  • 6.2 相关工作
  • 6.3 基于对象亲缘关系的垃圾收集算法
  • 6.3.1 定位频繁Cache失效的对象及类型
  • 6.3.2 对象亲缘图的建立
  • 6.3.3 基于对象亲缘关系的重排优化算法
  • 6.3.4 基于对象亲缘关系的分配算法
  • 6.4 性能评测与分析
  • 6.4.1 性能提升与算法开销
  • 6.4.2 频繁Cache失效类型分类
  • 6.4.3 对自适应预取优化的影响
  • 6.5 本章小结
  • 第七章 总结及未来工作
  • 7.1 本文工作总结
  • 7.2 未来研究方向
  • 参考文献
  • 致谢
  • 简历
  • 相关论文文献

    标签:;  ;  ;  ;  ;  ;  

    Java虚拟机的自适应动态优化
    下载Doc文档

    猜你喜欢