2012-07-16 48 views
2

我有一個內存泄漏,我很難找出問題所在。 ASP.NET進程每隔一段時間就提高到1GB。我按照這個頁面上的說明(http://humblecoder.co.uk/tag/windbg),!gcroot命令返回以下內容(最後x行)。我已經看過我所有的OracleConnections和OracleCommands,他們似乎是正確閉合並佈置:ASP.NET內存泄漏 - OracleCommand對象

6523dfd4  282  28200 System.Data.SqlClient.SqlParameter 
    0e90d850  548  28496 System.IO.MemoryStream 
    67b71a0c  1461  29220 System.Transactions.SafeIUnknown 
    7a5ee588  1924  30784 System.Collections.Specialized.ListDictionary+NodeKeyValueCollection 
    648c91f4  665  31920 System.Configuration.ConfigurationValues 
    7a5e5d04  1342  32208 System.Threading.Semaphore 
    652410f8  670  34840 System.Data.ProviderBase.DbConnectionPool+PoolWaitHandles 
    6613228c  1319  36932 System.Web.Security.FileSecurityDescriptorWrapper 
    66106948  2449  39184 System.Web.UI.AttributeCollection 
    0e8ff780  2021  40420 Microsoft.Win32.SafeHandles.SafeLsaPolicyHandle 
    01e34730  336  43008 Oracle.DataAccess.Client.OracleDataReader 
    648c9434  2218  44360 System.Configuration.ConfigurationValue 
    7a5ea0e4  1918  46032 System.Collections.Specialized.ListDictionary+NodeKeyValueCollection+NodeKeyValueEnumerator 
    7a5eaaa8  3088  49408 System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry 
    652435c4  1138  59176 System.Data.SqlClient.SqlBuffer 
    0e912c9c  2491  59784 System.Collections.ArrayList 
    0e9132c0  1236  69216 System.Collections.Hashtable 
    6614bf64  45  69660 System.Web.Caching.ExpiresEntry[] 
    0e8ff7d8  4042  80840 Microsoft.Win32.SafeHandles.SafeLsaMemoryHandle 
    66105ff4  5434  86944 System.Web.UI.StateBag 
    01e364c8  5686  90976 Oracle.DataAccess.Client.OpoSqlValTimeoutCtx 
    0e912e08  1007  91556 System.Int32[] 
    7a5ee300  3942  94608 System.Collections.Specialized.ListDictionary+NodeEnumerator 
    01e35ef8  7918  95016 Oracle.DataAccess.Client.OpoSqlRefCtx 
    01e353bc  6043  96688 Oracle.DataAccess.Client.MetaData 
    0e8f83e8  5017  100340 Microsoft.Win32.SafeHandles.SafeLocalAllocHandle 
    7a5ef738  6284  125680 System.Collections.Specialized.HybridDictionary 
    7a5ef7f4  5143  144004 System.Collections.Specialized.ListDictionary 
    661060d0 10908  174528 System.Web.UI.StateItem 
    0e91189c  533  184492 System.Char[] 
    6610d15c  2426  203784 System.Web.UI.WebControls.TableCell 
    01e362ec  7918  221704 Oracle.DataAccess.Client.OracleXmlQueryProperties 
    7a5ef8b4 11231  224620 System.Collections.Specialized.ListDictionary+DictionaryNode 
    65242390  1814  232192 System.Data.SqlClient._SqlMetaData 
    0e8f832c 12124  242480 Microsoft.Win32.SafeHandles.SafeTokenHandle 
    01e36444  7918  253376 Oracle.DataAccess.Client.OracleXmlSaveProperties 
    0e8f7ca8 13394  267880 Microsoft.Win32.SafeHandles.SafeWaitHandle 
    0e9133bc  1255  267912 System.Collections.Hashtable+bucket[] 
    0e8f7a98 12048  289152 System.Threading.ManualResetEvent 
    0e8e443c  7886  385508 System.Object[] 
    01e34b60  6456  387360 Oracle.DataAccess.Client.OpoConRefCtx 
    01e33860  6432  668928 Oracle.DataAccess.Client.OracleConnection 
    01e34f9c  6439  824192 Oracle.DataAccess.Client.OpoConCtx 
    01e34038  7918  1171864 Oracle.DataAccess.Client.OracleCommand 
    000dfbe0  70  5839608  Free 
    0e9136dc  2622  17492932 System.Byte[] 
    0e910c6c 56049  19472876 System.String 
    Total 283875 objects 
+0

包含的堆並不能解釋1 GB的內存佔用量。記憶峯值時創建的轉儲嗎?如果是這樣,你需要尋找其他地方的問題。您是否可以即時生成組件? – 2012-07-19 14:11:15

+0

@Brian Rasmussen,謝謝。我不會即時創建程序集。轉儲過程在超過1GB時創建。有很多字符串連接。如果56049字符串在內存中可能成爲問題,我會遊蕩嗎? – w0051977 2012-07-19 14:25:08

+0

字符串連接可能是個問題,但轉儲不會顯示佔用大量內存的大量字符串。所有的.NET進程都會有很多字符串。看着轉儲字符串似乎不是問題。您可以執行'!eeheap'來檢查其他堆。另外,轉儲文件有多大? – 2012-07-19 14:34:30

回答

0

如果內存使用下降到時間後200 MB,這說明你的內存beeing收集,但你仍然可能有一個記憶錯誤使用問題。 這個轉儲沒有顯示出很多,但是如果在你說的過程是1GB的時候,你仍然可以使用它: 1)在幾個對象上使用!gcroot,看看它們是如何連接到內存的將檢查數據庫的使用,看來你有大量的Oracle連接的(6432),以及很多其他DB的東西飄來飄去) 這樣的:

!dumpheap -MT <mt = the left most number> 

對象將顯示出與存儲器地址

!gcroot <address> 

對象堆棧將顯示如何將對象連接到內存樹。 a sample of this process

2)檢查性能計數器(開始 - >運行>性能監視器)添加這些計數器: - .NET CLR內存 - > #bytes所有堆 - 流程 - >專用字節 計算它們之間的差 - 這是非託管資源消耗的內存(如DB客戶端對象) 在低內存和高內存方案中檢查此內存,您將看到內存消耗主要是由於託管內存(所有堆)還是非託管內存。 3)如果內存不受管理,它仍然可能由託管對象保存,因爲主應用程序是託管的,所以在完成這些操作後確保釋放非託管資源是關鍵。 (關閉DBConnections,處理DBCommands,關閉文件句柄,釋放COMObjects等)

希望這會有所幫助, Amit。