实时系统中的垃圾收集器

时间:2009-11-04 18:50:23

标签: garbage-collection real-time soft-real-time

我是C#/ Java的新手,并计划将其原型化为软实时系统。

如果我编写C#/ Java应用程序就像我在C ++中的内存管理一样,也就是说,我明确地“删除”了我不再使用的对象,那么应用程序是否仍会受到垃圾收集器的影响?如果是这样,它对我的​​应用程序有何影响?

很抱歉,如果这听起来像是一个明显的答案,但是我想要彻底解决。

6 个答案:

答案 0 :(得分:8)

查看IBM's Metronome,他们的实时系统的垃圾收集器。

答案 1 :(得分:4)

您的前提是错误的:您无法显式“删除”Java或C#中的对象,因此您的应用程序将始终受GC的影响。

您可以尝试使用适当的参数(例如GC.Collect)调用GC.MaxGeneration(C#)来触发集合,但此仍然并不能保证GC赢了在执行期间的其他时刻不能工作。

答案 2 :(得分:3)

如果你意味着释放对象的引用,那么显式地“删除”那么你依赖于C#托管代码中的垃圾收集器 - see the System.GC class来控制它。

如果您选择编写非托管C#代码,那么您将拥有更多内存控制权,类似于C ++,并将负责删除实例化对象,能够使用指针等。有关详细信息,请参阅MSDN doc - Unsafe Code and Pointers (C# Programming Guide)

在非托管代码中,您将不受垃圾收集器及其不确定清理算法的支配。

我不知道Java是否具有等效的非托管模式,但是这个Microsoft信息可能有助于为C#/ .NET提供一些指导,以便根据您的处理垃圾收集器的要求使用其可用功能。

答案 3 :(得分:2)

在Csharp或Java中,您无法删除对象。您可以做的只是标记它们可供删除。释放的内存将由垃圾收集器完成。可能是垃圾收集器在应用程序的生命周期内可能无法运行的情况。然而它可能会运行。当您的系统缺少资源时,最有可能是运行时运行GC例程的时间。当资源较低时,GC成为优先级最高的线程。所以你的应用程序会受到影响。但是,您可以通过计算应用程序生命周期的正确负载和所需资源来最小化效果,并确保购买足够好的硬件。但是你仍然不能仅仅标记你的表现。

除了GC之外,由于涉及额外的委托层,托管应用程序确实比传统的C ++应用程序略有开销。在应用程序启动之前,运行时需要启动并运行第一次性能面板。

答案 4 :(得分:1)

以下是使用.net紧凑框架开发实时系统的一些参考资料:

他们都谈到了使用.net框架的内存要求。

答案 5 :(得分:-1)

C#和Java不适用于实时开发。当你注意到时,软实时是可以实现的。

对于C#,您可以做的最好是实现finalize / dispose模式:

http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx

您可以请求来收集它,但通常情况下,确定如何执行此操作要好得多。

http://msdn.microsoft.com/en-us/library/system.gc(VS.71).aspx

对于Java,有很多选项可以优化它:

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

如上所述,与IBM Metronome等第三方解决方案一起。

这是CS本身的真正科学。