2012-08-06 121 views
2

我正在检查我的服务的内存使用情况,并发现私人字节随着时间增加。该服务会创建所需的新组件,并且只有在服务停止时才会处理。所以我正在寻找在存在服务调用时创建新组件的代码,并在不需要时尝试处理它们。我正在使用PerfMon来检查专用字节。结构和垃圾收集

那么我在正确的轨道上呢?

此外,我发现该方法的一个每次创建新的结构,然后它不被处置或分配给null。

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

编辑:

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

我是否需要处置structInfo,如果我什么都不做,它会被GC收集吗?

+0

分配内存很贵。 CLR将会保留系统给它的尽可能多的内存。除非你遇到OOM异常,否则不要担心。 – Will 2012-08-06 12:47:42

+0

根据你我需要看看其他代码,而不是担心这个? – 2012-08-06 12:53:47

+2

Knuth认为,过早优化是万恶之源。你有没有记忆问题,“嘿,偶然我看了我的应用程序的内存使用情况,它不应该这么高”?如果不是,那么就放弃它。 – Will 2012-08-06 13:06:28

回答

3

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

有时您可能会发现内存使用量在不断增加,并且没有任何内存泄漏:如果有足够的内存可用,您的GC将无法经常运行。

我建议使用内存分析器,它可以告诉你为什么一些对象保持活着。我可以推荐YourKit for .NET profiler,其中有一个30天的免费试用:

  • 通过YourKit启动应用程序
  • 将存储快照
  • 搜索/浏览你的类你怀疑被泄露
  • 选择从GC-根路径
3

我在你的代码中看到info结构是返回给调用者。所以,从问题的角度来看,我会说,只有上帝知道谁会以及如何使用它。

关于结构调用Dispose(..)如果你有一些非托管资源内部分配,并希望摆脱它们的隐含。

在另一方面,如果你没有更多的需要的是info内存位置,只是分配一个null它,所以GC可能收集它下一个行程。

+0

Thanks.Its不可空,我不能改变这一点。更新我的问题。 – 2012-08-06 12:44:40

+1

@RaoBHavik:倾向于不像全局变量那样使用它,但是在嵌套执行的某个层次上,它变成了本地/函数变量,所以作为范围退出'GC'将清理它,所以。如果你需要更持久的东西,只需使用'class'来代替。 – Tigran 2012-08-06 12:50:19

1

服务营造它需要新的组件和他们只得到处理了when服务停止

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

我是否需要处置structInfo,会是GC回收,如果我没有做任何事情

如果structInfo是值类型,它只是在栈中分配和删除,如果它在你的片段中看起来很小的范围之外。 GC不参与此处。 structInfo的类型是否实现IDisposable(*)或其他类型的配置机制?如果是这样,请直接拨打Dispose

(*)除了一些特殊的情况,这是一个相当危险的业务,你需要非常清楚你在做什么。