论文部分内容阅读
Java程序语言因其高效和安全性在不同的平台都得到了广泛应用,从服务端到移动电话平台,因此提供高效的Java优化编译器与运行系统有着重要的意义。为了发挥多核优势,多核机器的普及增加了对多线程程序的需求。Java作为第一个在语言级提供对多线程支持的编程语言,是一种被广泛使用的并行编程语言。然而多线程编程难度较大,程序员容易引入并发错误,如数据竞争、死锁等。论文关注了Java程序的两个热点问题:运行时性能和并发错误检测。对于Java程序的运行时性能优化方面,论文基于Open64编译器构建了Java静态编译器Opencj,并基于Harmony DRLVM的运行时系统给出了动静态结合的编译优化框架。通过动静态结合的编译优化框架,尝试揉合动态优化与静态优化的各自优势进一步发掘优化空间,提高Java程序的运行时性能。Opencj读入Java的源程序或字节码,生成Linux/X86平台的可执行代码。Opencj完全继承了Open64的高效优化模块,并实现对Java异常机制的支持。Open64编译器采用一种树型结构的中间表示WHIRL。它能表示各种高级控制流结构,但不能显式的提供数据流信息。论文基于SSA(Static Single Assignment)对WHIRL进行扩展,提出一种新的优化结构WHIRL SSA。WHIRL SSA通过将SSA信息,包含版本信息、phi节点和别名访问的mu/chi节点,标注在WHIRL节点上,显式的为数据流分析提供使用-定义信息。WHIRL SSA是第一个同时包含了数据流和控制流信息、基于树结构高级中间表示的优化架构。论文讨论了基于WHIRL SSA的优化机会,并在该优化结构中实现了Java数组边界冗余检测的删除优化。优化的实现对科学计算类程序有着重要的意义。在NPB 3.0基准测试集的性能测试中,Opencj的静态优化性能比Sun JDK 1.6的性能平均快超过20倍。对于Java多线程程序的并发错误检测方面,论文关注数据竞争错误的动态检测。静态检测技术固有的不精确性导致过多假的错误报告,给程序员带来繁重的验证开销;相反动态检测技术能够报告出真正的竞争错误。但动态检测执行被插桩的代码和记录访问历史信息引入了巨大的时间开销,这限制了动态数据竞争检测器的广泛使用。先前的研究工作通过调整检测粒度减少对面向对象程序动态数据竞争检测的开销。但他们只有两层粒度:对象层和域层。论文基于一种数据竞争错误模式会多次发生的现象,通过对象拥有关系提出了三层粒度的动态检测算法,进一步减小了动态检测开销。检测器在JVM的垃圾回收模块中构建对象拥有关系树,依据happens-before策略,开始只监控全局对象的拥有者对象,当有潜在数据竞争发生时,自动调小检测粒度。论文在同一个JVM中实现了4种粒度的检测算法,给出了相对公平的性能比较。Java程序的测试结果表明三层粒度的检测算法在没有减少检测精度的情况下,比域层粒度减少了平均3倍的检测开销。论文最后讨论了动静态结合的编译优化框架并对论文进行了总结与展望。论文的主要贡献包括:●给出了一个动静结合的编译优化框架,运用动静态编译优化技术的合力进一步发掘程序的优化空间●实现了一个Java静态优化编译器Opencj●提出了一个新的基于高级中间表示的优化结构WHIRL SSA●基于WHIRL SSA实现了数组边界冗余检查删除的优化●提出了三层粒度的动态数据竞争检测的算法