询问者
怎么分析非托管内存是否有泄露?

问题
全部回复
-
-
我说的不够准确:是程序卡死,看log里的错误的信息要么是打印时,要么是GDI,要么是数据库取数据时。
错误的log:
1)
2022/2/16 10:50:29 句柄无效。
在 System.Drawing.Printing.StandardPrintController.OnStartPage(PrintDocument document, PrintPageEventArgs e)
在 System.Drawing.Printing.PrintController.PrintLoop(PrintDocument document)
在 System.Drawing.Printing.PrintController.Print(PrintDocument document)
在 System.Drawing.Printing.PrintDocument.Print()2)
2022-03-13 08:06:33: re:System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: System.Data.OracleClient.OracleException (0x80131938): ORA-03113: end-of-file on communication channel
Process ID: 4064
Session ID: 83 Serial number: 46423
在 System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
在 System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
在 System.Data.OracleClient.OracleCommand.ExecuteScalarInternal(Boolean needCLStype, Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
在 System.Data.OracleClient.OracleCommand.ExecuteScalar()
在 Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteScalar(IDbCommand command)
在 Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteScalar(DbCommand command) -
这看起来不像是内存泄漏,而是程序设计上有问题,可能是打印、存储数据过多缓存不够,或者发起的操作数量过多导致资源被耗尽之类的,能有错误记录就说明是“意料之中”的问题。内存泄露是“意料之外”的问题,因疏忽导致了内存没有被回收,这不会报错也不会卡死,内存泄漏如果最终将内存耗尽,那么程序通常会被操作系统直接给终止掉,您也可以查看任务管理器中的内存开销是否有异常增长。从您提供的信息看,这应该是打印、数据库等功能的调用方没有合理设计好操作流程,减少调用次数和频率,将打印、数据库等操作分开,简化问题后再调试,找出程序卡死的相关代码,针对这部分代码进行压力测试。
- 已建议为答案 Jiale Xue-MSFT 2022年3月16日 6:43