4

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

如果我像在 C++ 中的内存管理方面那样编写 C#/Java 应用程序,即我明确地“删除”我不再使用的对象,那么应用程序还会受到垃圾收集器的影响吗?如果是这样,它如何影响我的应用程序?

抱歉,如果这听起来像是一个显而易见的答案,但作为新人,我想彻底。

4

6 回答 6

8

看看IBM 的 Metronome ,他们用于实时系统的垃圾收集器。

于 2009-11-04T18:53:45.933 回答
4

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

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

于 2009-11-04T18:51:51.163 回答
3

如果您的意思是释放对对象的引用,则通过显式“删除”,那么您依赖于 C# 托管代码中的垃圾收集器 -请参阅 System.GC 类以了解控制它的方法。

如果您选择编写非托管 C# 代码,那么您将对内存有更多控制权,类似于 C++,并负责删除您的实例化对象,能够使用指针等。有关更多信息,请参阅MSDN 文档 - 不安全代码和指针 ( C# 编程指南)

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

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

于 2009-11-04T19:09:57.153 回答
2

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

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

于 2009-11-04T19:10:24.347 回答
2

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

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

于 2009-11-08T03:02:50.700 回答
-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 本身的一门真正的科学。

于 2009-11-04T19:00:51.020 回答