【问题标题】:GarbageCollector, Dispose or static Methods?GarbageCollector、Dispose 还是静态方法?
【发布时间】:2009-11-18 08:22:52
【问题描述】:

上个月我开发了一些课程。它们变得越来越大(每个类大约 30-40 个方法)。

我从不考虑内存泄漏、垃圾收集器或类似的东西(我必须说这是我自己的第一个大项目)。

现在我有带方法的课程,大约有 15 个课程,每个课程最少。 20 种方法。 50% 是 DAL 中的 Linq 类,50% 是带有 BusinessLogic 的业务类。 NO Class 使用全局变量(不需要),所以理论上我可以让它们成为静态类+方法。目前它们不是,我初始化一个类对象并使用该类 - 而不是处置它。

当系统由大约 100 个用户运行时,如果我对内存泄漏等感到愤怒,我应该从哪里开始?

【问题讨论】:

    标签: c# memory-leaks garbage-collection dispose


    【解决方案1】:

    不用担心类的方法,因为它们不会消耗内存:每个方法在类定义中只存在一次。真正占用内存的是字段形式的对象中包含的数据。

    关于处理对象(我在这里假设 .NET),除非您使用非托管资源,否则没有必要。垃圾收集器会在必要时负责释放所有托管资源(即带有数据的普通对象)。

    如果您想了解有关 .NET 垃圾收集器以及如何处理内存泄漏的更多信息,例如,您可以查看此处:http://www.codeproject.com/KB/dotnet/Memory_Leak_Detection.aspx。但如果您刚开始项目,我会专注于获得清晰且可维护的设计,而不是内存管理问题。

    【讨论】:

    • 不幸的是,只有当您在“非托管资源”的定义中包含“将对象添加到长期列表”等内容时,您关于非托管资源的陈述才是正确的。由于不再需要时没有拆除的事件(或观察者模式),在 CLR/Java 应用程序中发生内存泄漏是很常见的。
    • 关于声明的另一条评论:“关于释放对象,除非您使用非托管资源,否则没有必要。”这不是真的。您还必须处置任何实现您拥有的 IDisposable 接口的托管资源。
    【解决方案2】:

    您是否可以创建一个类static 不取决于“全局”变量的使用,而是取决于一个类是否使用实例字段(类成员变量)这一事实。如果您的方法不使用实例数据,则可以是静态的(并且有轻微的偏好)。如果所有方法都是静态的,您也可以将类设为静态。

    【讨论】:

    • 是的,我知道并且是这个意思,但是什么是 - 记忆思维 - 这样做的专业人士?
    • Kowu,听起来好像不是内存问题,只要确保编写正确的代码即可。 .NET 内存处理很简单,但不像使用静态或其他东西那么简单。
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多