我们正在运行一个基于.Net 1.1的Windows (,而不是,一个ASP.Net应用程序),并且在重载下得到System.OutOfMemoryException错误。
该服务基本上承载一个内存缓存,由一个资产哈希表组成,嵌套在其中是一个帐户哈希表,在其中一个类存储一个给定时间段的值(用于Asset+Account组合)。该服务向客户端提供此数据的聚合,并接受对数据的更新。在整个服务寿命期间,节点总数保持不变。
在machine.Config中,我们可以看到如下内容:
<processModel
enable="true"
timeout="Infinite"
idleTimeout="Infinite"
shutdownTimeout="00:00:05"
requestLimit="Infinite"
requestQueueLimit="5000"
restartQueueLimit="10"
memoryLimit="60"
webGarden="false"
cpuMask="0xffffffff"
userName="machine"
password="AutoGenerate"
/>所有这些似乎都与ASP.Net/IIS应用程序相关,但我们的OutOfMemoryException并不是在ASP.Net下发生的,而且似乎没有针对非ASP应用程序的等效配置设置。
本节是否适用于所有基于.Net的应用程序,而不仅仅是ASP.Net?
我之所以这样问是因为,当错误发生时,我们的服务占用了大约1.2 GB的内存(是的,我们正在内存中存储一个大型数据库,这是有充分理由的),这恰好相当于2GB内存的60% ( 32位应用程序的内存“限制”)。这个明显的IIS配置设置会导致我们的windows服务内存也被限制吗?
更复杂的是,我们在.Net 1.1 32位上运行,在64位 Windows 2003下运行(是的,我们确实有理由进行这种不寻常的配置),有12 GB的内存。据我所知,每个32位进程应该能够寻址最多4GB的RAM,不是吗?或者,这是否需要更改注册表或.Net配置文件?
注意:我知道/3GB窗口启动开关,但由于我们在64位窗口,我认为这不应该适用(但请随时纠正我,如果我错了)。
更新1
人们似乎同意processModel配置只适用于ASP.Net应用程序。
一个答案是,64位操作系统上的32位应用程序在每个进程中仍然有2GB的限制,但我找到的大多数引用都表明,在64位操作系统上,每个32位进程都可以访问4GB。(但是,这可能只是通过设置IMAGEFILELARGEADDRESSAWARE位才启用的?)
一些相关链接
如何为IMAGE_FILE_LARGE_ADDRESS_AWARE应用程序设置C#位:
http://bytes.com/groups/net-c/569198-net-4gt
32位应用程序的IIS6可用内存(32 OS内存):
32位应用程序的IIS6可用内存--在x64操作系统上使用x64应用程序(32 OS )
.NET调试演示实验室3:内存:
http://blogs.msdn.com/tess/archive/2008/02/15/net-debugging-demos-lab-3-memory.aspx
对于找到OutOfMemoryException的细节应该是有用的吗?
推动限制-虚拟内存:
http://blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx
阅读这篇文章以理解概念,并使用testlimit排除机器/配置问题。一旦确信这是你的应用程序的错,请阅读和重读苔丝博客上的文章。
最后更新
好吧,对于我们的情况,这显然是缺少一个.Net服务Pack....apparently --远程处理得到这个异常有一个问题,在服务包完全清除之后!
发布于 2009-08-05 01:33:30
processModel配置元素特定于ASP.NET进程,不适用于其他.NET进程。
如果您在64位操作系统上运行32位进程,则您的进程仍受32位进程的限制,即2GB。实际限制实际上接近1.5到1.8GB,这取决于您的应用程序特性-换句话说,您实际上不太可能达到2GB进程障碍。
为了让Windows服务充分利用4GB的进程空间,您需要:
还请考虑应用程序的内存分配概要文件。如果要分配大小大于85K的对象,则这些对象将在大型对象堆中分配。大对象堆被扫描,但不像其他堆那样紧凑,这意味着您可能正在经历碎片,这将最终阻止.net内存管理器分配连续的内存块以满足请求。
您可能希望获取进程的快照,并查看哪些对象在哪些堆中,以便更好地了解进程内存空间中正在发生的事情。
此外,检查服务器上页面文件的大小。考虑到页面文件在所有进程中共享,不适当大小的页面文件也会导致问题,尽管这往往会导致系统异常的错误,并且在“虚拟内存”周围有一些语句。
祝好运!
Z
参考文献:
Windows版本的内存限制
Tess Ferrandez,.NET调试:内存
发布于 2009-08-05 01:17:12
ProcessModel密钥仅用于ASP.NET,即使在Windows 2003上,它也几乎毫无用处,因为您拥有Application配置。
/3GB开关不适用于64位Windows.
据我所知,如果将对象固定在内存中,防止GC在集合发生时有效地对内存堆栈进行碎片整理,则可以获得OutOfMemoryExceptions。
如果您知道您的服务中有千兆字节的数据,那么您应该考虑将您的服务移动到64位的应用程序中。如果你接近极限,那你就是在玩火。
https://stackoverflow.com/questions/1230413
复制相似问题