我剛剛將第一個C#WebAPI應用程序交付給第一個客戶。在正常負載下,性能最初甚至比我預期的要好。原來。C#WebAPI垃圾回收
一切正常,直到在某些時候,內存已啓動並且垃圾收集開始運行暴亂(如「收集尚未垃圾的對象」)。那時,有多個W3WP線程,共有10個演唱會演唱會,每個演員只有一位數的演出。 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
被我主動取消。
我認爲內存增加速度減慢了,因爲我主動將最常用的控制器中最大的數組變量設置爲null,但這只是一種直覺,甚至不是一個完整的解決方案。
我現在將使用您提供的鏈接進行一些分析,並返回一些結果。
自動垃圾收集!=我不必考慮內存管理;獲取一個內存分析器並將該應用程序配置文件查找通過什麼對象來查找*和*的對象。 –
我質疑你的假設,它收集的對象不是垃圾。你如何驗證這一點?並且請注意,即使在託管內存中也很容易造成泄漏。如果您存儲對不再需要的事物的引用(事件通常是此處的罪魁禍首),則您仍會泄漏內存。要檢測內存泄漏,您應該使用專門爲此目的製作的工具,例如Red-Gate ANTS Memory Profiler等。 –
請注意,由於簡單地清除指針而忘記釋放指向的內存並不是真正的問題管理內存。但保留引用你不再需要,是。 –