首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >processModel memoryLimit只适用于ASP.Net吗?(System.OutOfMemoryException)

processModel memoryLimit只适用于ASP.Net吗?(System.OutOfMemoryException)
EN

Stack Overflow用户
提问于 2009-08-04 23:22:58
回答 2查看 2.9K关注 0票数 2

我们正在运行一个基于.Net 1.1的Windows (,而不是,一个ASP.Net应用程序),并且在重载下得到System.OutOfMemoryException错误。

该服务基本上承载一个内存缓存,由一个资产哈希表组成,嵌套在其中是一个帐户哈希表,在其中一个类存储一个给定时间段的值(用于Asset+Account组合)。该服务向客户端提供此数据的聚合,并接受对数据的更新。在整个服务寿命期间,节点总数保持不变。

在machine.Config中,我们可以看到如下内容:

代码语言:javascript
复制
    <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 --远程处理得到这个异常有一个问题,在服务包完全清除之后!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-05 01:33:30

processModel配置元素特定于ASP.NET进程,不适用于其他.NET进程。

如果您在64位操作系统上运行32位进程,则您的进程仍受32位进程的限制,即2GB。实际限制实际上接近1.5到1.8GB,这取决于您的应用程序特性-换句话说,您实际上不太可能达到2GB进程障碍。

为了让Windows服务充分利用4GB的进程空间,您需要:

  • 将您的流程标记为LARGE_ADDRESS_AWARE。相信使用editbin.exe可以做到这一点,但我从来没有这样做过!它也可能会打开一罐新的虫子..。)我会看看我是否能验证。
  • 在/3GB中添加boot.ini
  • 重新启动服务器

还请考虑应用程序的内存分配概要文件。如果要分配大小大于85K的对象,则这些对象将在大型对象堆中分配。大对象堆被扫描,但不像其他堆那样紧凑,这意味着您可能正在经历碎片,这将最终阻止.net内存管理器分配连续的内存块以满足请求。

您可能希望获取进程的快照,并查看哪些对象在哪些堆中,以便更好地了解进程内存空间中正在发生的事情。

此外,检查服务器上页面文件的大小。考虑到页面文件在所有进程中共享,不适当大小的页面文件也会导致问题,尽管这往往会导致系统异常的错误,并且在“虚拟内存”周围有一些语句。

祝好运!

Z

参考文献:

Windows版本的内存限制

Tess Ferrandez,.NET调试:内存

票数 2
EN

Stack Overflow用户

发布于 2009-08-05 01:17:12

ProcessModel密钥仅用于ASP.NET,即使在Windows 2003上,它也几乎毫无用处,因为您拥有Application配置。

/3GB开关不适用于64位Windows.

据我所知,如果将对象固定在内存中,防止GC在集合发生时有效地对内存堆栈进行碎片整理,则可以获得OutOfMemoryExceptions。

如果您知道您的服务中有千兆字节的数据,那么您应该考虑将您的服务移动到64位的应用程序中。如果你接近极限,那你就是在玩火。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1230413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档