C# 结构和垃圾收集

C# 结构和垃圾收集,c#,memory-leaks,garbage-collection,value-type,C#,Memory Leaks,Garbage Collection,Value Type,我正在检查我的服务的内存使用情况,发现私有字节随着时间的推移而增加。该服务创建它所需的新组件,并且只有在服务停止时才会处理这些组件。因此,我正在搜索在有服务调用时创建新组件的代码,并尝试在不需要时处理它们。我正在使用PerfMon检查私有字节 到现在为止,我走对了吗 此外,我发现其中一个方法每次都创建新的struct,然后它不会被释放或分配给null var structInfo = new MyStruct(); structInfo .StructSize = Marshal.SizeOf(

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

到现在为止,我走对了吗

此外,我发现其中一个方法每次都创建新的struct,然后它不会被释放或分配给null

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

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


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

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

如果您在结构中分配了一些非托管资源,并且希望以特别方式除去它们,请在结构上调用
Dispose(..)

另一方面,如果您不再需要
info
内存位置,只需给它分配一个
null
,这样
GC
可能会在下次行程中收集它。

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

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

我建议使用内存分析器,它可以告诉您为什么某些对象保持活动状态。我可以推荐30天免费试用的:

  • 通过工具包启动应用程序
  • 拍摄内存快照
  • 搜索/浏览您怀疑正在泄漏的类
  • 从GC根目录中选择路径
该服务创建它所需的新组件,并且只有在服务停止时才会处理这些组件

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

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

如果
structInfo
是一个值类型,则仅在堆栈上分配它,如果它超出范围(在代码段中似乎很小),则将其删除。这里不涉及GC。
structInfo
类型是否实现了
IDisposable
(*)或其他类型的处理机制?如果是,请明确地调用
Dispose


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

谢谢。它不可为空,我无法更改。更新了我的问题。@RaoBHavik:tend不要像使用全局变量一样使用它,但在某种嵌套执行级别上,它会变成局部/函数变量,因此当作用域退出时,GC会清理它,所以。如果您需要更耐用的东西,只需使用
class
即可。分配内存非常昂贵。CLR将保留系统提供的内存。除非你遇到OOM异常,否则别再担心了。根据你的说法,我需要看看其他代码,而不是担心这个问题?根据Knuth的说法,过早优化是万恶之源。除了“嘿,碰巧我查看了我的应用程序的内存使用情况,它不应该这么高”之外,您是否还有其他内存问题?如果没有,那就让它去吧。