.net - System.Runtime.InteropServices.COMException(0x80070008): Not enough storage is available to process this command

标签 .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)
...

看起来任何普通类型的“存储”都没有达到任何限制。该应用程序使用大约 400MB 内存、70 个线程、2000 个句柄,并且硬盘驱动器有许多 GB 可用空间。该计算机运行的是 Windows 2003 Enterprise Server 32 位,具有 16GB RAM,因此内存不应该成为问题。

应用程序作为 Windows 服务运行,因此没有使用 GDI 对象。 GDI 句柄用完是此异常的常见原因。

数据库连接、命令和读取器都用 using block 包装,因此应该正确清理它们。

更新:将我们使用的线程数从 12 个减少到 4 个似乎已经解决了该问题。我们成功地连续运行了 24 个小时以上,没有出现任何错误,而最终只持续了 4 到 8 个小时。 更新2:我从来没有弄清楚我们用完了什么资源,但减少线程数量似乎已经解决了问题。或者至少隐藏它。

最佳答案

您需要考虑的另一个因素是内存碎片。

您可以执行的最大单次分配等于进程可用的最大连续内存块。由于碎片的原因,这几乎总是小于进程中可用的内存总量。也就是说,位于 2 个空闲内存块之间的已分配内存块会“碎片化”空间。

进程中的碎片越多,可用的最大连续内存块就越小。我见过这样的情况:有接近 1GB 的可用内存,但最大的连续 block 约为 10MB。

您是否检查过此过程中的内存碎片?

关于.net - System.Runtime.InteropServices.COMException(0x80070008): Not enough storage is available to process this command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2435186/

相关文章:

c# - 动态生成时自定义 C# Enum ToString()

SQL (Oracle) - 如何从两个计数语句中获取比率?

sql - 在 oracle 10g 中连接三个表

.net - 捕捉到基于十六进制的网格中最近的六边形中心

.net - Asp.Net MVC 3 部分页面输出缓存不支持配置设置

c# - 为什么 CSS 文件会受到全局 asax 中 Application_BeginRequest 的影响

mysql - 数据库触发器根据一张表更新另一张表

mysql - 查询在mysql中花费了很多时间,但在oracle中却没有

java - Oracle 10g 在日期中接受 5 位数年份

asp.net - Oracle 10 和 Oracle 11 客户端共存