实时Java,第4部分 - 实时垃圾收集 - 编程入门网
实时Java,第4部分 - 实时垃圾收集时间:2011-06-22 Benjamin Biron Rya实时系统和垃圾收集 实时(RT)应用程序开发与通用应用程序开发的差异在于前者对部分运行时行为强加了时间限制。此类限制通常是对应用程序的某些部分实施的,比如中断处理程序,其响应中断的代码必须在给定的时间范围内完成工作。对于硬 RT 系统,比如心脏监测器或国防系统,如果这类系统的运行超出时限,可以看作是整个系统的灾难性失败。而对于软 RT 系统,超出时限可能会有些不利影响 —— 比如 GUI 不能显示其监控流的所有结果 —— 但是不会导致系统失败。 在 Java 应用程序中,Java 虚拟机(JVM)负责优化运行时行为、管理对象堆以及接合操作系统和硬件。虽然语言和平台之间的这个管理层简化了软件开发,但同时也给程序带来了一定数量的开销。GC 就是一个这样的例子,它通常会导致应用程序中的不确定性暂停。暂停的频率和时长都不可预测,使得 Java 语言在传统上并不适合开发 RT 应用程序。一些基于 Java 实时规范(RTSJ)的现有解决方案使开发人员能够避开 Java 技术的不确定性方面,但是需要对现有的编程模型做些更改。 Metronome 是一种确定性的垃圾收集器,为标准的 Java 应用程序提供有限制的低暂停时间和指定的应用程序利用率。有限制的暂停时间的减少源于收集方法的增加和细致的工程决断,包括对 VM 的基本更改。利用率是指应用程序所能够运行的特定时间窗中的时间百分比,剩余时间则用于 GC。Metronome 让用户能够指定应用程序的利用率级别。通过与 RTSJ 结合使用,Metronome 使开发人员能够在时间窗很小的情况下构建具有确定的低暂停时间和无暂停的软件。本文解释了 RT 应用程序的传统 GC 的限制,详述了 Metronome 的方法,并且为使用 Metronome 开发硬 RT 应用程序提供了一些工具和指导。 传统 GC 传统 GC 实现使用 stop-the-world (STW) 方法来恢复堆内存。应用程序一直运行,直至耗尽堆的可用内存,此时 GC 停止所有的应用程序代码、执行垃圾收集,然后让应用程序继续运行。 图 1 演示了用于 GC 活动的传统的 STW 暂停,这些暂停在频率和持续时间方面通常都不可预测。传统的 GC 是不确定的,因为恢复内存所需执行工作的数量取决于应用程序所使用对象的总的数量和大小、这些对象之间的相互连接,以及为释放足够的堆内存以满足未来分配所需完成的工作的多少。 图 1. 传统 GC 暂停 实时Java,第4部分 - 实时垃圾收集(2)时间:2011-06-22 Benjamin Biron Rya传统 GC 非确定性的原因 考察一下 GC 的基本组件,就不难理解 GC 时间没有限制并且不可预测的原因了。GC 暂停通常包括两个独立阶段:标记 阶段和清理 阶段。虽然很多实现和方法可以结合或修改这两个阶段的含义,或通过其他手段(如压缩或减少堆中的碎片)来增强 GC,或使某些阶段的操作与应用程序的运行并发执行,这两个概念是传统 GC 的技术基线。 标记阶段负责跟踪应用程序可见的所有对象并将它们标记 为活的,以免回收它们的存储。这个跟踪以根集 开始,它由一些内部结构组成,比如线程栈和对象的全局引用。跟踪然后遍历引用链直至标记完根集中所有(直接或间接)可获得的对象。标记阶段最后也没有标记的对象是应用程序不可获得的对象(死对象),因为不存在从根集经过任何引用序列找到这些对象的路径。标记阶段的长度不可预测,原因是应用程序中活对象的数目在任何特定时间都不可预测,并且遍历所有引用以便找到系统中所有活对象的耗费也不可预测。一个运行稳定的系统中的 oracle 可以根据以前的计时特征来预测时间需求,但是这些预测的精确性又是不确定性的另一个来源。 清理阶段负责在标记完成后考察堆并回收死对象 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |