2

メモリ リークがあり、どこに問題があるのか​​を突き止めるのに非常に苦労しています。ASP.NET プロセスは、時々 1GB に増加しています。このページ (http://humblecoder.co.uk/tag/windbg) の指示に従いましたが、!gcroot コマンドは次の内容を返します (最後の x 行)。私はすべての OracleConnections と OracleCommands を調べましたが、それらは閉じられて正しく破棄されているようです:

   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
4

1 に答える 1

0

しばらくしてメモリ使用量が 200 MB に低下した場合、これはメモリが収集されていることを示していますが、メモリの誤用の問題がまだ残っている可能性があります。このダンプはあまり表示されませんが、あなたが言ったようにプロセスが1GBのときに取得された場合は、まだ使用できます:1)いくつかのオブジェクトで !gcroot を使用して、それらがメモリにどのように接続されているかを確認します(確認しますDB の使用状況、大量の Oracle 接続 (6432) があり、他の多くの DB が浮かんでいるようです。) 次のように:

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

オブジェクトはメモリアドレスで表示されます

!gcroot <address>

オブジェクト スタックは、オブジェクトがメモリ ツリーにどのようにアタッチされているかを表示します。 このプロセスのサンプル

2) パフォーマンス カウンター (start->run->perfmon) を確認し、次のカウンターを追加します。 DB クライアント オブジェクトのように) 低メモリおよび高メモリのシナリオでこれを確認すると、メモリ消費が主にマネージ メモリ (すべてのヒープ) によるものか、アンマネージド メモリによるものかがわかります。3) メモリが管理されていない場合でも、メイン アプリケーションが管理されているため、管理されているオブジェクトによって保持される可能性が高いため、管理されていないリソースを使い終わったら解放することが重要です。(DBConnection を閉じる、DBCommand を破棄する、ファイル ハンドルを閉じる、COMObject を解放するなど)

これが役に立てば幸いです、アミット。

于 2012-11-26T07:53:05.680 に答える