Java语言的一个重要特点就是通过垃圾收集器(Garbage Collector,GC)自动管理内存的回收。程序员利用Java语言开发时,只需在需要时创建对象,而不必考虑对象空间的释放。当在Java虚拟机上运行Java应用程序时,垃圾收集器负责为应用程序提出的对象创建请求分配空间,并在空闲空间不足时主动启动垃圾收集过程回收不再被使用的对象空间以供重复使用。这种内存分配与回收机制极大地简化了Java程序的开发工作。
垃圾收集器在Java虚拟机中一般由一个或一组进程来实现的,它本身也和用户程序一样需要占用内存空间,运行时也消耗CPU资源。在传统的垃圾收集器实现中,当垃圾收集进程运行时,需要暂停应用程序的运行。因此,当垃圾收集过程较长时,会影响到应用程序的执行效率。为了降低垃圾收集器管理内存的时空开销,除了进一步改进垃圾收集器本身的算法外,由即时编译器(Just-in-time compiler, JIT)分析应用程序并在其中安插显式释放对象甚至是特殊的对象分配等指令,辅助垃圾收集器改进对象的回收与分配,是减轻垃圾收集器自动回收负担的一种有效途径。
本项目研究探讨通过即时编译辅助改善Java内存管理的技术(不仅尝试改善对象回收,还尝试改善对象分配),并选择在开源的Java SE项目Apache Harmony上进行实现。
垃圾收集技术在现代语言及其编译运行系统中越来越流行,Java语言基于GC的自动内存管理系统给Java程序员在带来很大方便的同时,也由于GC运行时的额外开销降低了程序的执行效率。尽管GC的性能在过去的十多年里得到了很大的提升,但是它仍然是制约Java应用程序的一个瓶颈。譬如,典型的企业级应用程序SPECjbb2005花费在GC上的执行时间占到总执行时间的10%。我们提出研究即时编译辅助的垃圾收集,是希望利用程序分析、编译优化等技术来协助GC完成Java内存管理,从而进一步提高GC的性能。这对提高采用GC的编译运行系统的整体性能是非常重要的。
[顶层]我们在实际的虚拟机(即Apache Harmony上的DRLVM)上研究开发即时编译辅助的垃圾收集。图1是整个系统的框架,主要涉及Java虚拟机中的即时编译器(JIT)、垃圾收集器(GC)和虚拟机核心(VMCore)三个模块,其中阴影部分是我们研究开发的重点。
在Harmony中,JIT采用流水线编译机制来编译优化Java字节码。流水线依次载入待编译的方法的字节码,首先将字节码翻译成平台无关的高级中间表示(High-level Intermediate Representation,HIR),然后由代码选择器将HIR转换为平台相关的低级中间表示(Low-level Intermediate Representation,LIR),最后发射为可执行的本地代码,并由VMCore负责驱动执行。JIT对应用程序的HIR和LIR分别执行一系列的优化遍。
本项目的研究内容主要包括以下三个方面: