我在ASP.NET Web应用程序中调试OOM问题。使用perfmon计数器,确定存在非托管空间问题。因此,我使用Debugdiag生成转储并从中创建内存压力分析报告。
要点:
oracommon10.dll负责270.16 MB的未完成分配。
顶级内存消耗功能: oracommon10!sktsfMalloc + c:270.16 MBytes的未完成分配。
功能:oracommon10!sktsfMalloc + c
分配类型C / C ++运行时分配
分配计数455分配
分配大小270.16 MBytes
泄漏概率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)
答案 0 :(得分:0)
如果您已阅读此类帖子,
您将看到识别构建完整图像所需的罪魁祸首。泄漏跟踪规则只能帮助您更好地了解非托管资源的使用情况,但要分析其发生的原因,需要进行彻底的分析。
我的理解是,
因此,我建议您通过http://support.microsoft.com打开支持案例,并与Microsoft支持团队共享转储。他们在这些问题上有更多的经验。