2012-08-01 43 views
0

我正在調試ASP.NET Web應用程序中的OOM問題。使用perfmon計數器,發現未處理空間存在問題。因此,我使用Debugdiag生成轉儲並從中創建內存壓力分析報告。識別導致內存泄漏的原生方法


摘要:

oracommon10.dll負責270.16兆字節值得傑出分配。

頂部內存消耗功能: oracommon10!sktsfMalloc + c:270.16 MBytes未完成的分配。

功能:!oracommon10 sktsfMalloc + C

分配類型C/C++運行時分配(一個或多個)

分配次數455分配(多個)

分配大小270.16兆字節

泄漏概率95%


從下面的調用堆棧示例(在最頂級的.Net調用之後,我包含了本地調用),有人能幫我理解這一點嗎? 我認爲這可能是Oracle連接之一未關閉的問題。


Function   Source    Destination 
oracommon10!sktsfMalloc+c       msvcr71!malloc 
orageneric10!kghaex+5ef  
ntdll!ZwSetEventBoostPriority+c  
ntdll!RtlpUnWaitCriticalSection+22 
OraClient10!kpuinit0+a5c  
OraClient10!kpuenvcr+ea 
OraClient10!OCIEnvCreate+3d 
oci!OCIEnvCreate+2a 
0x1CE2A1F  
mscorwks+3ad8  
System.Data.OracleClient.OciHandle..ctor(System.Data.OracleClient.OciHandle, HTYPE, MODE, HANDLEFLAG)  
System_Data_OracleClient_ni+e1d38  
System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionPool, System.Data.Common.DbConnectionOptions)  
System.Data.OracleClient.OracleConnection.Open()  
Microsoft.Practices.EnterpriseLibrary.Data.Database.GetNewOpenConnection()  
Microsoft.Practices.EnterpriseLibrary.Data.Database.GetOpenConnection(Boolean) 
Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader(System.Data.Common.DbCommand) 
Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleDatabase.ExecuteReader(System.Data.Common.DbCommand) 
MyDAL.MyMethod(System.String, System.String, Int32) 
+1

歡迎來到StackOverflow。請編輯你的問題上的標籤,以表明你正在使用什麼編程語言(很明顯你使用的是.NET語言,但是直到你真正打開這個問題,許多人可能會回答這個問題就不會感到困擾)。沒有其他標籤的「內存」是相當無意義的。添加適當的標籤可以幫助人們瞭解您的問題,並提高您獲得答案的機會。 – 2012-08-01 23:38:08

+0

您確定連接正在關閉嗎? – 2012-08-01 23:55:23

+0

解決了很久以前的問題,但忘記在這裏更新。問題出現在代碼的另一部分,允許用戶通過鍵入三個或更多字符進行搜索。邏輯中的一個錯誤,啓動了對數據庫的調用,以從表中獲取所有行。當代碼被擊中後,非託管空間開始填充,私有字節瘋狂地爆發,直到應用程序崩潰。 – Aras 2013-11-14 17:23:12

回答

0

如果您已經閱讀這樣的職位,

http://blogs.msdn.com/b/tess/archive/2009/02/03/net-memory-leak-to-dispose-or-not-to-dispose-that-s-the-1-gb-question.aspx

你會看到,以確定你需要建立一個完整的圖像的罪魁禍首。泄漏跟蹤規則只會幫助您更好地瞭解非託管資源如何被使用,但要分析爲什麼發生,需要進行徹底的分析。

我的理解是,

  1. 我們還沒能借鑑「Oracle連接的一個未關閉」的結論,因爲調用堆棧並不表示。
  2. 如果沒有關於其他線程,託管堆等的所有信息,則無法進一步討論。
  3. 沒有Oracle符號,從本地方很難說。

所以我給你的建議是通過http://support.microsoft.com打開支持案例,並與微軟支持團隊共享轉儲。他們在這些問題上有更多的經驗。

+0

謝謝!我一直在關注Tress的博客。這個非常好。我能夠學到很多東西。仍在調查這個問題。當我找到它時會在這裏更新.. – Aras 2012-08-06 21:46:25