快速业务通道

实时Java,第4部分 - 实时垃圾收集 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
非常重要。这一任务由 JVM 和即时(JIT)编译器负责完成。虽然检查暂停请求会带来系统开销,但是可以根据 GC 的需要很好地定义一些结构(比如栈),让它精确地确定栈中的值是否为对象的指针。

这种暂停机制仅用于当前参与 JVM 相关活动的线程;非 Java 线程或 Java 本地接口(JNI)代码外并且不使用 JNI API 的 Java 线程不服从暂停。如果这些线程参与了任何 JVM 活动(比如连接到 JVM 或调用 JNI API),则它们将协作性的进行暂停,直至完成 GC 时间量。这一点很重要,原因在于它使 Java 处理相关的线程继续得到调度。虽然线程的优先级会得到考虑,但是在这些其他的线程中对系统进行任何可见形式的干扰都会影响 GC 的确定性。

实时Java,第4部分 - 实时垃圾收集(6)

时间:2011-06-22 Benjamin Biron Rya

写入屏障

全面的 STW 收集器具有以下优点:可以跟踪对象引用和 JVM 内部结构,应用程序不会干扰对象图中的链接。通过将 GC 循环分解为一系列小的 STW 阶段并与应用程序交错执行,Metronome 确实带来了跟踪系统中活对象的潜在问题。因为应用程序在处理对象后可能修改对象的引用,使收集器无法察觉未处理对象。图 7 演示了隐藏对象的问题:

图 7. 隐藏对象问题

实时Java,第4部分 - 实时垃圾收集 - 编程入门网

假定图 7 第 I 段所描述的堆中存在一个对象图。Metronome 收集器处于活动状态并在此时间量中被分配执行跟踪工作。在其分配的时间段中,它的作用是在时间用完之前跟踪根对象及其引用的对象,并且需要将 JVM 调回 II 段。在应用程序的运行期间,对象之间的引用会发生变化,因此对象 A 现在指向一个未处理对象,该对象不再被 III 段中的任何其他位置引用。然后 GC 被调回并在其他的时间量中继续处理,漏掉这个隐藏 对象指针。结果是,在把未标记对象返回到自由列表的 GC 的清理阶段,将会回收一个活对象,产生一个悬空 指针,导致不正确的行为或者甚至是 JVM 或 GC 中的破坏。

为了防止出现此类错误,JVM 和 Metronome 必须协作跟踪堆和 JVM 的更改,使 GC 将所有的相关对象保持为活的。这项任务通过写入屏障 来完成,它将跟踪所有的对象写操作并记录对象间引用的创建和销毁,使收集器可以跟踪潜在隐藏的活对象。Metronome 所使用的屏障类型称为初始快照(snapshot at the beginning,SATB)屏障。它在收集循环开始时在概念上记录堆的状态并保留当时的和当前循环中分配的所有活对象。具体的解决方案涉及一个 Yuasa 类型的屏障(请参阅 参考资料),其中将会记录任何字段存储中的重写值并将其视为具有相关的根引用。在重写启用活对象设置保护和处理之前保留槽的原始值。

内部 JVM 结构也需要此类屏障处理,包括 JNI 全局引用列表结构。因为应用程序可以向此列表中添加对象和从中删除对象,所以可以使用屏障来跟踪删除的对象(避免类似于字段重写的隐藏对象问题)和添加的对象(消除重新扫描结构的需求)。

根扫描和根处理

为了开始跟踪活对象,垃圾收集器从一组根 中获得的初始对象开始。根是 JVM 中的结构,表示了应用程序显式(如 JNI 全局引用)创建或隐式(如栈)创建的对象的硬引用。根结构被作为收集器中标记阶段初始功能的一部分进行扫描。

大多数根在执行期间可以根据其对象引用进行延展。出于这个原因,必须跟踪对它们的引用设置的更改,如 写入屏障 一节所述。但是,某些结构(如栈)不能提供对未造成严重性能影响的 push 和 pop 的跟踪。因此,对扫描栈作出了某些限制和更改,使 Metronome 能够适合 Yuasa 形式的屏障:

栈的原子扫描。单独线程栈必须自动进行扫描,或在单个时间量内扫描。这样做的原因在于,执行期间线程可以从其栈中弹出任意数量的引用 —— 执行过程中可能存储在其他位置的引用。栈扫描过程中的暂停可能导致丢

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号