我在同一应用程序池下的 IIS 6.0、Windows Server 2003 框中安装了许多应用程序实例。它们共享许多相同的程序集,并且不能加入到单个应用程序中。
我最近添加了一个新的应用程序实例,并在尝试加载 ASP.NET 2.0 应用程序时获得了 System.OutOfMemoryException。
使用 GAC 存储通用程序集会修复此错误,还是只能通过在不同应用程序池之间设置站点来解决此问题?
我在同一应用程序池下的 IIS 6.0、Windows Server 2003 框中安装了许多应用程序实例。它们共享许多相同的程序集,并且不能加入到单个应用程序中。
我最近添加了一个新的应用程序实例,并在尝试加载 ASP.NET 2.0 应用程序时获得了 System.OutOfMemoryException。
使用 GAC 存储通用程序集会修复此错误,还是只能通过在不同应用程序池之间设置站点来解决此问题?
将某些内容放入 GAC 只会更改 DLL 的物理位置(和安全设置),它不会更改加载到内存中的内容。
大多数人倾向于认为 GAC 是“微软放置他们的东西的地方”。我还没有看到很多由“其他人”创建的应用程序可以证明使用 GAC 是合理的。
您可能应该开始考虑一个负载平衡解决方案,因为您正在给您的机器施加如此大的 RAM 压力。
确保您在 Machine.Config 中设置了部署零售 =“true”:
<system.web>
<!--
<deployment
retail = "false" [true|false]
/>
-->
<deployment retail="true" />
</system.web>
调试代码比非调试代码占用更多的内存,并且编译成单个程序集而不是每页一个将减少程序集加载的内存开销。
确保您的应用程序池上的内存设置设置得足够高,并且您可能还想查看 ProcessModel MemoryLimit 设置:http: //msdn.microsoft.com/en-us/library/7w2sway1 (VS .71).aspx
并尝试使用 80% 或 85% 设置:
<processModel
memoryLimit="80"
/>
将共享程序集放入 GAC 可以节省驱动器空间,例如。如果您有 20 个使用相同 dll 的 asp 应用程序。可能是您将更少的相同 dll 副本加载到内存中,我不确定。也就是说,OutOfMemoryErrors 更有可能是由于将非常大的对象加载到内存中引起的,典型的例子是 DataSet。与内存中的大型数据集或大型 xml 文件所占用的内存相比,程序集很小。
这发生在什么类型的请求上?您可能想了解 OutOfMemoryExceptions 的这个常见原因。