结构和垃圾收集
我正在检查我的服务的内存使用情况,并发现私人字节随着时间增加。该服务会创建所需的新组件,并且只有在服务停止时才会处理。所以我正在寻找在存在服务调用时创建新组件的代码,并在不需要时尝试处理它们。我正在使用PerfMon来检查专用字节。结构和垃圾收集
那么我在正确的轨道上呢?
此外,我发现该方法的一个每次创建新的结构,然后它不被处置或分配给null。
var structInfo = new MyStruct();
structInfo .StructSize = Marshal.SizeOf(structInfo);
MyClass info = this.BuildStructInfo(structInfo);
return info;
编辑:
该方法返回其自结构获取其值的类。
我是否需要处置structInfo
,如果我什么都不做,它会被GC收集吗?
结构是一个值类型(例如int)。如果它超出范围,它将自动被GC'ed。
有时您可能会发现内存使用量在不断增加,并且没有任何内存泄漏:如果有足够的内存可用,您的GC将无法经常运行。
我建议使用内存分析器,它可以告诉你为什么一些对象保持活着。我可以推荐YourKit for .NET profiler,其中有一个30天的免费试用:
- 通过YourKit启动应用程序
- 将存储快照
- 搜索/浏览你的类你怀疑被泄露
- 选择从GC-根路径
我在你的代码中看到info
结构是返回给调用者。所以,从问题的角度来看,我会说,只有上帝知道谁会以及如何使用它。
关于结构调用Dispose(..)
如果你有一些非托管资源内部分配,并希望摆脱它们的隐含。
在另一方面,如果你没有更多的需要的是info
内存位置,只是分配一个null
它,所以GC
将可能收集它下一个行程。
Thanks.Its不可空,我不能改变这一点。更新我的问题。 – 2012-08-06 12:44:40
@RaoBHavik:倾向于不像全局变量那样使用它,但是在嵌套执行的某个层次上,它变成了本地/函数变量,所以作为范围退出'GC'将清理它,所以。如果你需要更持久的东西,只需使用'class'来代替。 – Tigran 2012-08-06 12:50:19
服务营造它需要新的组件和他们只得到处理了when服务停止
因此,您的服务必须以某种方式坚持这些组件。它可能是有目的的(例如缓存)或偶然的,只有你可以知道。
我是否需要处置structInfo,会是GC回收,如果我没有做任何事情
如果structInfo
是值类型,它只是在栈中分配和删除,如果它在你的片段中看起来很小的范围之外。 GC不参与此处。 structInfo
的类型是否实现IDisposable
(*)或其他类型的配置机制?如果是这样,请直接拨打Dispose
。
(*)除了一些特殊的情况,这是一个相当危险的业务,你需要非常清楚你在做什么。
分配内存很贵。 CLR将会保留系统给它的尽可能多的内存。除非你遇到OOM异常,否则不要担心。 – Will 2012-08-06 12:47:42
根据你我需要看看其他代码,而不是担心这个? – 2012-08-06 12:53:47
Knuth认为,过早优化是万恶之源。你有没有记忆问题,“嘿,偶然我看了我的应用程序的内存使用情况,它不应该这么高”?如果不是,那么就放弃它。 – Will 2012-08-06 13:06:28