我只是发表我的第一个C#的WebAPI应用程序的第一个客户。 在正常负荷下,最初的表现甚至比我预期的要好。 原来。
一切运行良好,直到,在某些时候,内存上涨和垃圾收集开始运行骚乱(如“它收集尚未成为垃圾对象”)。 在这一点上,有多个线程W3WP的RAM十几个演出干脆,和每个工人的个位数的演出。 IIS的一切重启后恢复正常,但当然,内存使用量再度上升。
请纠正我,如果我错了,但
- 应该不是C#有自动垃圾收集?
- 它不应该是容易的GC收集的WebAPI应用程序的垃圾?
并请帮我出:
- 我怎样才能明确说明GC应该收集哪些,从而避免了内存泄露? 是
someBigList = null;
要走的路? - 我怎么可以检测内存泄漏是谁?
编辑:让我澄清一些事情。
我的.NET应用程序的WebAPI大多是一帮
public class MyApiController:ApiController
{
[HttpGet]
public MyObjectClass[] MyApi(string someParam) {
List<MyObjectClass> list = new List<MyObjectClass>();
...
for/while/foreach {
MyObjectClass obj = new MyObjectClass();
obj.firstStringAttribute = xyz;
...
list.Add(obj);
}
return list.ToArray();
}
}
在这种条件下,GC应该很容易:“回归”后,所有局部变量应该是垃圾。 然而,随着每一个呼叫使用内存增加。
我最初以为C#的WebAPI程序的行为类似于(预编译)PHP:IIS调用程序时,它被执行时,返回值,然后被完全设置关闭。
但这种情况并非如此。 举例来说,我发现静态变量来运行之间的数据,现在我布置的所有静态变量。
因为我发现静态变量是对GC的一个问题:
internal class Helper
{
private static List<string> someVar = new List<string>();
internal Helper() {
someVar=new List<string>();
}
internal void someFunc(string str) {
someVar.Add(str);
}
internal string[] someOtherFunc(string str) {
string[] s = someVar.ToArray();
someVar=new List<string>();
return s;
}
}
在这里,低内存情况下,someVar扔了一个空指针错误,这在我看来只能通过GC造成的,因为我没有找到任何地方的代码someVar
正在积极通过我无效。
我认为内存增速放缓,因为我积极最常用的控制器以空集最大的数组变量,但这只是一个直觉,甚至几乎没有一个完整的解决方案。
我现在将使用您提供的链接做了一些分析,并取回了一些成果。