论文部分内容阅读
Java语言是一种面向对象的语言,它运行在Java虚拟机的平台之上.Java语言具有模块化好,跨平台和类型安全等特点.这些特点使得Java语言更适合于被用来进行快速安全的大规模的软件开发,因此该语言已经被广泛地使用在服务器,客户端和移动计算等应用领域中.Java语言的另一个软件工程上的优势来自于Java虚拟机中自动内存管理的使用.自动内存管理也被称作垃圾收集(garbage collection),它能够使程序员避免对显式分配和回收内存的依赖,从而在很大程度上减少了内存泄漏及悬挂指针等内存错误的发生,提高了软件开发的效率.垃圾收集所具有的这种优势也使得它被广泛地部署在除Java之外的多种运行时系统之中.
然而,尽管垃圾收集的引入能够提高软件开发的效率,但是垃圾收集系统却有可能会给应用程序的性能带来负面的影响,这主要是由于垃圾收集的运行时间是被包括在程序运行的总时间之内的.另外,一些垃圾收集算法能够移动对象的位置,因此,这些垃圾收集算法能够对应用程序的数据对象的局部性造成影响,从而影响程序的性能.一个良好的垃圾收集的设计和实现应该能够尽量地减少收集所消耗的运行时间,提高收集的效率,减少垃圾收集所带来的暂停时间同时尽可能地获取好的对象局部性.
围绕垃圾收集所带来的问题及其对应用程序性能的影响,本文系统深入地研究了Java虚拟机中的垃圾收集机制,其主要的创新和贡献如下:
第一,设计并实现了一个支持灵活的运行时切换垃圾收集算法的内存管理软件框架--RSMTk,并且避免了在收集算法切换过程中由于分配函数的内联而引起的方法重编译.比较了不同的垃圾收集算法和不同的对象拷贝序对应用程序的对象局部性的影响.比较分析了在拷贝垃圾收集中,分代内的不同分区间的拷贝序和不同分代间的拷贝序对对象局部性的影响.结果表明,分代内的不同分区间的对象拷贝序是影响对象局部性的主要因素.构建了一个结合预取和局部性优化技术的软件框架,结果发现基于规则的数组结构的预取更容易取得性能的改进.调查了on-chip的local memory在Java应用中对内存系统性能的影响.结果表明,on-chip local memory和cache相结合的系统能够比cache-only的系统具有更优的性能.
第二,分析了服务器端Java应用中的对象生命周期行为,发现其中存在着大量长生命周期的对象.设计并实现了一种混合垃圾收集,利用几种经典收集算法的运行时动态切换及其相互的协作来减少垃圾收集对长生命周期对象的重复操作.使用SPECjbb2005对该算法进行了评估.实验结果表明,与经典的分代垃圾收集相比,该混合收集算法能够使SPECjbb2005的Throughput分值提高3﹪~25﹪.
第三,设计并实现了一种新的并行垃圾收集标记算法--task-pushing.该算法利用了CSP(Communicating Sequential Processes,通信顺序进程)的思想,通过将标记过程构造成一个处理网络来避免对同步原语的依赖同时获得良好的动态负载平衡.为了支持这种无需同步操作的并行标记算法,设计了一种高性能的通信队列,该队列利用现有硬件所支持的字对齐访问的原子性来避免对同步原语的使用.实验结果表明,与传统的work-stealing技术相比,task-pushing所带来的性能好处会随着处理器个数的增加而变得越来越大.对于pseudojbb和GCOld这两个服务器端的基准测试程序来说,当处理器的个数为16时,task-pushing的加速比(speedup)比work-stealing分别提高了17.4﹪和13.5﹪.