在過去的幾天裏,我一直試圖在應用程序中識別內存泄漏。我有充分的理由相信它來自這段代碼;Parallel.Invoke()可能的內存泄漏?
List<Item> Items = new List<Item>();
List<Action> Actions = new List<Action>();
while (true)
{
//The queue is a singleton which is used by multiple threads.
//This method grabs the lock and dequeues 500 items at a time.
Items = ItemQueue.Instance.DequeuePackageByAmount(500);
if (Items == null) break;
for (int i = 0; i < Items.Count; i++)
{
int copy = i;
Actions.Add(new Action(() => DoSomethingWithItem(Items[copy])));
}
Parallel.Invoke(new ParallelOptions { MaxDegreeOfParallelism = 500 }, Actions.ToArray());
Items.Clear();
Actions.Clear();
}
Item
不包含任何應該丟棄的未管理資源。爲了完整性;
public class Item
{
public ICollection<string> SomeCollection;
public string SomeString;
}
而且,當然;
public void DoSomethingWithItem(Item item)
{
ItemProcessor processor = new ItemProcessor();
processor.Process(item);
}
public class ItemProcessor
{
private DbContextWrapper db;
public ItemProcessor()
{
//DbContextWrapper contains methods which talk to the database.
//Every method has a using(), so there should be no DbContext resources
//left undisposed.
db = new DbContextWrapper();
}
public void Process(Item item)
{
foreach(string s in item.SomeCollection)
{
//check some things and push it to the next queue if valid
}
}
}
我知道我不應該問請找內存泄漏因爲代碼是僞。因此;
是否有可能這段代碼易受內存泄漏的影響,如果是,哪裏?
編輯1:
爲了進一步解釋我有充分的理由相信,它來自這一段代碼;我已經測試了幾塊代碼,這塊是分配最多內存的塊。大約5分鐘後,我的應用程序使用大約1.6G RAM,不久之後,它崩潰了OutOfMemoryException
。
此外,爲了進一步解釋DbContextWrapper
,它看起來像這樣;
AFAIK,這種方式應該沒有非託管資源留下不處理。
你可以看看你的代碼幾個小時......或者你可以創建內存轉儲和分析它。你試過了嗎?或者你可以使用內存分析器 - 你試過了嗎? – 2014-11-21 11:41:28
你說*我有充分的理由相信它來自這段代碼*和How?你有沒有介紹你的申請? – 2014-11-21 11:42:50
在MaxDOP中指定500不會運行得更快,它只會導致492個不活動的任務,假設您有一個帶有超線程的四元代碼。爲什麼你想爲每個項目運行不同的操作,而不是僅僅對數據執行一個Parallel.ForEach?您無故創建500名代表。 – 2014-11-21 11:44:18