2

我正在检查我的服务的内存使用情况,发现私有字节随着时间的推移而增加。该服务创建它需要的新组件,并且它们仅在服务停止时被处置。所以我正在寻找在有服务调用时创建新组件的代码,并在不需要它们时尝试处理它们。我正在使用 PerfMon 检查私有字节。

到目前为止,我在正确的轨道上吗?

此外,我发现其中一种方法每次都会创建新结构,然后它不会被处置或分配给 null。

var structInfo = new MyStruct();
structInfo .StructSize = Marshal.SizeOf(structInfo);
MyClass info = this.BuildStructInfo(structInfo);
return info;

编辑:

该方法返回从结构中获取其值的类。

我是否需要处理structInfo,如果我不做任何事情,它会被 GC 收集吗?

4

3 回答 3

3

我在您的代码中看到的是infostruct返回给调用者。因此,从问题的读者的角度来看,我想说,只有上帝知道谁以及如何使用它。

Dispose(..)如果您在内部分配了一些非托管资源,并且想要明确地摆脱它们,请调用该结构。

另一方面,如果您不再需要该info内存位置,只需为其分配一个null,以便下次旅行GC可能会收集它。

于 2012-08-06T12:38:38.187 回答
3

结构是一种值类型(例如 int)。如果超出范围,它将自动被 GC。

您有时会看到内存使用量不断增长,而根本没有任何内存泄漏:如果有大量可用内存,您的 GC 就不会经常运行。

我建议使用内存分析器,它可以向您展示为什么某些对象保持活动状态。我可以推荐YourKit for .NET profiler,它有 30 天的免费试用期:

  • 通过 YourKit 启动您的应用程序
  • 拍摄内存快照
  • 搜索/浏览您怀疑泄漏的课程
  • 从 GC-root 中选择路径
于 2012-08-06T13:00:36.920 回答
1

该服务创建它需要的新组件,并且它们仅在服务停止时被释放

因此,您的服务必须以某种方式保留这些组件。它可能是故意的(例如缓存)或偶然的,只有您可以知道。

我需要处理 structInfo,如果我不做任何事情,它会被 GC 收集吗

IfstructInfo是一个值类型,它仅在堆栈上分配并在超出范围时被删除,这在您的代码段中似​​乎很小。这里不涉及GC。structInfo执行类型IDisposable(*) 还是其他类型的处置机制?如果是这样,请Dispose显式调用。

(*) 抛开一些特殊情况不谈,这是一项风险很大的业务,您需要非常清楚自己在做什么。

于 2012-08-06T14:04:20.663 回答