实时Java,第4部分 - 实时垃圾收集 - 编程入门网
5. GC 循环利用率
图 5 的 A 段是一个梯型图,其中下降的部分对应于 GC 时间量,而平缓的部分对应于应用程序时间量。梯型表示 GC 通过与应用程序交错实现低暂停时间,从而产生目标利用率的梯状下降。组成 B 段的应用程序活动只保持所有滑动窗口的利用率目标。利用率模式只在模式开始时显示 GC 活动,这一点很常见。原因在于只要得到允许,GC 就会运行(保持暂停时间和利用率),而这通常意味着它会在模式开始时耗尽分得的时间并允许应用程序在时间窗的剩余部分恢复执行。C 段表示利用率接近目标利用率时的 GC 活动。上升的部分表示应用程序时间量,而下降的部分表示 GC 时间量。造成此段呈锯齿状的原因同样是因为 GC 和应用程序交错执行以便保持低暂停时间。D 段表示 GC 循环完成前的部分。此段呈上升趋势表示 GC 不再运行而应用程序将重新获得 100% 的利用率。 在 Metronome 中,用户可以指定目标利用率;本文的 调整 Metronome 一节提供了与此相关的更多信息。 实时Java,第4部分 - 实时垃圾收集(4)时间:2011-06-22 Benjamin Biron Rya使用 Metronome 运行应用程序 Metronome 的设计目的是为现有的应用程序提供 RT 行为。不需要修改用户代码。期望的堆大小和目标利用率必须针对应用程序进行调整,使目标利用率保持期望的应用程序吞吐量,同时使 GC 能够满足分配。用户应该按照希望维持的最大负载运行应用程序,以便保证 RT 特征和充足的应用程序吞吐量。本文的 调整 Metronome 一节说明了吞吐量或利用率不足时可以执行哪些操作。在某些情形下,Metronome 的短暂停时间保证不能满足应用程序的 RT 特征。此时,您可以使用 RTSJ 来避免 GC 导致的暂停时间。 Java 实时规范 RTSJ 是 “一种使 Java 程序能够用于实时应用程序的 Java 平台规范”。Metronome 必须意识到 RTSJ 的某些方面 —— 尤其是 RealtimeThread(RT 线程)、NoHeapRealtimeThread(NHRT)和永久内存。除了别的特征外,RT 线程是以高于普通 Java 线程的优先级运行的 Java 线程。NHRT 是不能包含堆对象引用的 RT 线程。换言之,NHRT 能够访问的对象不能引用服从 GC 的对象。作为对这种妥协的交换,GC 不会阻止 NHRT 的调度,即使在 GC 循环期间也是如此。这意味着 NHRT 不会导致任何暂停时间。永久内存提供了一个不服从 GC 的内存空间;即,NHRT 可以引用永久对象。这些只是 RTSJ 的一些方面,有关完整规范的链接,请参阅 参考资料。 确定性 GC 相关的技术问题 Metronome 使用 J9 虚拟机中的几个关键方法来实现确定的暂停时间,同时保证 GC 的安全性。这些方法包括 arraylet、基于时间的垃圾收集器调度、用于跟踪活对象的根结构处理、协调 J9 虚拟机和 GC 以保证能够找到所有的活对象,以及用于暂停 J9 虚拟机来提供 GC 时间量的机制。 Arraylet 虽然 Metronome 通过将收集过程分解为步进的工作单元实现了确定的暂停时间,但是在某些情形下分配可能导致 GC 中出现 hiccup。大对象的分配就是一个这样的例子。对大多数收集器实现而言,分配子系统持有一个自由堆内存池,应用程序通过分配对象使用该池,然后由收集器通过清理来补充该池。第一次收集后,自由堆内存主要是一些曾经的活对象(现在已死)的结果。因为没有关于这些对象如何死去或何时死去的可预测模式,所以得到的堆上的自由内存是大小不一的碎片集合,即使会出现相邻死对象合并的情况。此外,每个收集循环会返回一个不同的自由块模式。结果,如果没有足够大的自由内存块能够满足请求的需要,则分配一个很大的对象就会失败。这些大对象通常是数组;标准对象一般不会多于几十个字段,在大多数 JVM 中常常占用不到 2K 的空间。 为了缓解碎片问题,一些收集器针对 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |