我正在检查我的服务的内存使用情况,发现私有字节随着时间的推移而增加。该服务创建了它所需的新组件,并且只有在服务停止时才会处理它们。所以我正在搜索在有服务调用时创建新组件的代码,并在不需要时尝试处理它们。我正在使用PerfMon来检查私有字节。
我现在走在正确的轨道上直到现在?
此外,我发现其中一个方法每次都会创建新结构,然后它不会被处理或指定为null。
var structInfo = new MyStruct();
structInfo .StructSize = Marshal.SizeOf(structInfo);
MyClass info = this.BuildStructInfo(structInfo);
return info;
修改
该方法返回从结构中获取其值的类。
我是否需要处理structInfo
,如果我不做任何事情,是否会收集GC?
答案 0 :(得分:3)
我在代码中看到的是info
struct 返回给调用者。因此,从问题的读者来看,我会说,只有上帝知道谁和将如何使用它。
如果您在内部分配了一些非托管资源,并且想要明确地删除它们,请在结构上调用Dispose(..)
。
另一方面,如果您不再需要info
内存位置,只需为其分配null
,因此GC
可能会收集它下一次旅行。
答案 1 :(得分:3)
struct是一种值类型(例如int)。如果它超出范围,它将自动进行GC。
你有时可以看到内存使用量不断增长和增长,根本没有任何内存泄漏:如果有足够的可用内存,你的GC将不会经常运行。
我建议使用内存分析器,它可以显示为什么某些对象保持活动状态。我可以推荐YourKit for .NET profiler,其中有30天的免费试用版:
答案 2 :(得分:1)
该服务会创建所需的新组件,并且只有在服务停止时才会处理
所以你的服务必须以某种方式坚持这些组件。它可能是出于目的(例如缓存)或意外,只有你可以知道。
我是否需要处理structInfo,如果我不做任何事情,它将被GC收集
如果structInfo
是一个值类型,它只会在堆栈上分配,如果它超出了你的代码段中看起来很小的范围,就会删除它。此处不涉及GC。 structInfo
的类型是否实现IDisposable
(*)或其他某种处置机制?如果是,请明确地致电Dispose
。
(*)除了一些特殊情况外,这是一项非常冒险的业务,您需要非常了解自己在做什么。