2013-06-27 48 views
0

我已經創建了一個由4塊(包括一個可選塊)組成的數據流管道,它負責通過HTTP從我的應用程序接收查詢對象,並從數據庫中檢索信息,做一個可選的轉換該數據,然後將信息寫回HTTP響應中。數據流管道持有內存

在我做的一些測試中,我一直在從數據庫中拉出大量數據(570萬行),這些數據存儲在List對象中,並在不同的塊之間傳遞,看起來好像在最後的塊已經完成,內存沒有被釋放。任務管理器中的內存使用量將高達2 GB以上,並且List可能會在每個塊中都出現幾次大的峯值。

我的塊中的簽名是這樣的:

private TransformBlock<HttpListenerContext, Tuple<HttpListenerContext, QueryObject>> m_ParseHttpRequest; 
private TransformBlock<Tuple<HttpListenerContext, QueryObject>, Tuple<HttpListenerContext, QueryObject, List<string>>> m_RetrieveDatabaseResults; 
private TransformBlock<Tuple<HttpListenerContext, QueryObject, List<string>>, Tuple<HttpListenerContext, QueryObject, List<string>>> m_ConvertResults; 
private ActionBlock<Tuple<HttpListenerContext, QueryObject, List<string>>> m_ReturnHttpResponse; 

它們鏈接如下:

m_ParseHttpRequest.LinkTo(m_RetrieveDatabaseResults); 
m_RetrieveDatabaseResults.LinkTo(m_ConvertResults, tuple => tuple.Item2 is QueryObjectA); 
m_RetrieveDatabaseResults.LinkTo(m_ReturnHttpResponse, tuple => tuple.Item2 is QueryObjectB);   
m_ConvertResults.LinkTo(m_ReturnHttpResponse); 

是否有可能,我可以建立流水線,使得一旦每個塊完成與列表他們不再需要堅持它,以及一旦整個管道完成內存釋放?

回答

1
  1. 數據流塊應該保存對已處理消息的引用沒有理由。因此,我相信他們不這樣做。如果他們真的這樣做,那麼我認爲這是一個你應該報告的錯誤。

  2. 在任務管理器中報告的大內存使用率並不一定意味着沒有收集對象。這也可能意味着框架沒有將GCed內存返回到操作系統。我相信,當你有足夠的空閒內存時,這個框架對於返回內存很懶,因爲沒有充分的理由這樣做。

    你應該做的是使用更合適的工具。例如,您可以使用.Net性能計數器來非常密切地監視GC。您還可以使用內存分析器查看有關內存使用情況的更多詳細信息,如果實際存在內存泄漏,則會導致內存泄漏。