结构和垃圾收集

时间:2012-08-06 12:34:31

标签: c# memory-leaks garbage-collection value-type

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

我现在走在正确的轨道上直到现在?

此外,我发现其中一个方法每次都会创建新结构,然后它不会被处理或指定为null。

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

修改

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

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

3 个答案:

答案 0 :(得分:3)

我在代码中看到的是info struct 返回给调用者。因此,从问题的读者来看,我会说,只有上帝知道谁和将如何使用它。

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

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

答案 1 :(得分:3)

struct是一种值类型(例如int)。如果它超出范围,它将自动进行GC。

你有时可以看到内存使用量不断增长和增长,根本没有任何内存泄漏:如果有足够的可用内存,你的GC将不会经常运行。

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

  • 通过YourKit
  • 启动您的应用程序
  • 拍摄内存快照
  • 搜索/浏览您怀疑要泄漏的课程
  • 从GC-root选择路径

答案 2 :(得分:1)

  

该服务会创建所需的新组件,并且只有在服务停止时才会处理

所以你的服务必须以某种方式坚持这些组件。它可能是出于目的(例如缓存)或意外,只有你可以知道。

  

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

如果structInfo是一个值类型,它只会在堆栈上分配,如果它超出了你的代码段中看起来很小的范围,就会删除它。此处不涉及GC。 structInfo的类型是否实现IDisposable(*)或其他某种处置机制?如果是,请明确地致电Dispose

(*)除了一些特殊情况外,这是一项非常冒险的业务,您需要非常了解自己在做什么。