Dar*_*ten 8 .net oracle oracle10g
我正在尝试诊断此异常:
System.Runtime.InteropServices.COMException (0x80070008): Not enough storage is available to process this command. (Exception from HRESULT: 0x80070008)
at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType)
at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(Type objectType)
at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(Type serverType)
at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(Type serverType, Object[] props, Boolean bNewObj)
at Oracle.DataAccess.Client.CThreadPool..ctor()
at Oracle.DataAccess.Client.OracleCommand.set_CommandTimeout(Int32 value)
...
Run Code Online (Sandbox Code Playgroud)
看起来任何正常类型的"存储"都没有达到任何限制.该应用程序使用大约400MB的内存,70个线程,2000个句柄,硬盘驱动器有许多GB免费.该机器运行Windows 2003 Enterprise Server 32位,内存为16GB,因此内存不应成为问题.
应用程序作为Windows服务运行,因此没有使用GDI对象.耗尽GDI句柄是此异常的常见原因.
数据库连接,命令和阅读器都使用块包装,因此应该正确清理它们.
更新:将我们使用的线程数从12减少到4似乎解决了这个问题.在我们持续4到8小时之前,我们设法在没有错误的情况下运行超过24小时. UPDATE2:我从未弄清楚我们用尽了什么资源,但减少线程数似乎已经解决了问题.或至少隐藏它.
您需要考虑的另一个因素是内存碎片.
您可以执行的最大单个分配等于进程可用的最大连续内存块.由于碎片,这几乎总是小于进程中可用的内存总量.这是分配在2个空闲内存块之间的内存块"片段"空间.
您在进程中拥有的碎片越多,可用的最大连续内存块就越小.我已经看到有大约1GB内存可用的情况,但最大的连续块大约是10MB.
您是否在此过程中检查了内存碎片?
| 归档时间: |
|
| 查看次数: |
14954 次 |
| 最近记录: |