2011-09-28 65 views
7

有一個WCF自我託管服務必須工作99%的時間。有時候,我們得到了一些麻煩的內存這樣的:堆內存問題

memory leaks

但服務後問題的工作如常。我們如何處理這個問題?任何提示和要點,使強大的服務,將生存在不同的情況下,是非常受歡迎的。

+0

您是否擁有純託管代碼,或者您是否擁有非託管代碼或互操作代碼? –

+0

所有代碼都被管理。我們使用[devArt的dotConnect for Oracle](http://www.devart.com/dotconnect/oracle/)作爲數據層庫。 – kseen

+0

你爲什麼要禁用ASCII轉儲?你知道它可以使用左邊的代碼完全重建嗎? – Dani

回答

3

我不太確定問題出在哪裏,但內存泄漏可能是一個原因。

所有的代碼都被管理。我們使用devArt的dotConnect for Oracle作爲 數據層庫。

您假定所有代碼都被管理,但可能存在非託管部分。但是,在使用它們之後,必須調用Dispose方法來處理所有可丟棄對象,不要認爲一旦它們超出範圍就會被正確處置。最佳做法是,不要讓Disposable對象超出範圍而不調用其Dispose方法。如果您將它們用作局部變量,則可以使用'using'語句。

DbConnection是一次性對象的一個​​很好的例子,確保你處理所有的連接(一次性對象)。

+2

+1,很好的建議,Oracle DAL確實需要Dispose,因爲它們使用了非託管代碼,因爲處置Oracle連接和命令通常是最耗時的操作一個應用程序(IMHE) –

0

如果這是一個WCF問題(我不確定如何處理您的轉儲),我建議您激活WCF服務器端跟蹤,並查看異常(如果有)(並編輯您的問題我們可以進一步幫助你)。

下面是解釋如何做到這一點的鏈接:

How to enable WCF tracing

0

什麼是您的服務行爲特別ConcurrencyMode和InstanceContextMode。

如果將Multiple作爲ConcurrencyMode和InstanceContext設置爲(PerCall或PerSession(默認值)),那麼如果您有大型DataStructures或未設置的資源,則可以定義問題。

,如果你正在使用多個併發嘗試InstanceContextMode單[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,InstanceContextMode = InstanceContextMode.Single)]

0

你是你依賴的100%,無有非託管代碼?我看到了與這種情況非常相似的事情,而這種情況發生是因爲我們正在釋放內存,以致另一個進程稍後也會嘗試釋放內存。