0

ASP.NET Web アプリケーションで OOM の問題をデバッグしています。perfmon カウンターを使用して、管理されていない領域に問題があることを特定しました。そこで、Debugdiag を使用してダンプを生成し、そこからメモリ プレッシャ分析レポートを作成しました。


概要:

oracommon10.dll は、270.16 MB 相当の未処理の割り当てを担当しています。

先頭へ メモリーを消費する関数: oracommon10!sktsfMalloc+c: 270.16 MB相当の未処理の割当て。

関数: oracommon10!sktsfMalloc+c

割り当てタイプ C/C++ ランタイム割り当て

割り当て数 455 個の割り当て

割り当てサイズ 270.16 MB

リーク確率 95%


以下のコール スタックのサンプル (最上位の .Net コールの後にネイティブ コールを含めました) から、これを理解するのに役立つ人がいますか? これは、閉じられていない Oracle 接続の 1 つに問題がある可能性があると想定しています。


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) 
4

1 に答える 1

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-質問.aspx

完全なイメージを構築するために必要な犯人を特定することがわかります。リーク トラック ルールは、管理されていないリソースがどのように消費されたかをよりよく理解するのに役立ちますが、なぜそれが起こったのかを分析するには、徹底的な分析が必要です。

私の理解は、

  1. コール スタックがそれを示していないため、「閉じられていない Oracle 接続の 1 つ」についてはまだ結論を出すことができませんでした。
  2. 他のスレッド、マネージ ヒープなどに関するすべての情報がなければ、これ以上議論することはできません。
  3. Oracle シンボルがないと、ネイティブ側から見分けることも困難です。

したがって、http://support.microsoft.comからサポート ケースを開いて、Microsoft サポート チームとダンプを共有することをお勧めします。彼らはそのような問題についてより多くの経験を持っています。

于 2012-08-02T02:11:59.193 に答える