在博客园看到了一位园友写的文章
《如何处理OutOfMemoryException异常?》
,于是想和大家交流一下
ASP.NET
中出现
OutOfMemoryException
的问题。
实际上,在 ASP.NET Web 服务器上, ASP.NET 所能够用到的内存,通常不会等同于所有的内存数量。在 machine.config 配置文件中, 配置节<processModel>中有一个属性 “memoryLimit” ,这个属性的值是一个百分值,默认为 “60” ,即指定了 ASP.NET 进程(在任务管理器中大家就可以看到 ASP.NET 的进程, IIS5 中为 aspnet_wp , IIS6 中为 w3wp )能够使用所有物理内存的 60% 。当 ASP.NET 使用的内存量超过这个限额时, IIS 会开始自动回收( recycle )进程,即创建一个新的进程去负责应付 Http 请求,而将旧进程所占用的内存回收。
当我们有一台很大内存的服务器时, “memoryLimit” 这个值是需要进行适当的调整的。比如我们准备了一台 4G 内存的服务器,那么 4G ×60% = 2.4G 。但是,对于 Win32 操作系统,一个进程所能占用的所有内存空间只有 2G 。当 ASP.NET 进程占用的内存开始达到 2G 时,由于它并没有达到 2.4G 的 “ 回收阈值 ” ,所以 IIS 不会启动 recycle 进程操作,但是由于 Win32 的限制,实际上已经不能给这个进程分配更多的内存了,于是, OutOfMemoryException 就很可能会被抛出了。为了避免这样的情况,我们就必须将 “memoryLimit” 适当调小,以让 IIS 更早的进行进程回收。
微软推荐的 ASP.NET 进程占用内存是不超过 60% ,并最好使计算出的实际值不超过 800M 。就是说,对于一台 4G 内存的服务器,最好将 “memoryLimit” 属性设置成 “20” 。设置一个适当的回收阈值,让 IIS 适时的进行进程回收,对于保证整个服务器的稳定运行,避免 OutOfMemoryException 是非常重要的。
在 IIS6 中, ASP.NET 进程的回收阈值不再由 配置节中的 “memoryLimit” 属性决定,而是由 IIS 管理器中的应用程序池配置中的设置决定。
但是,即使正确设置了这些配置,也不能保证完全避免 OutOfMemoryException 的发生,原因可能是多样而复杂的,比如内存回收操作可能耗时太多等等。开发人员要注意的,就是在代码中时刻牢记不要无谓的使用和浪费内存。 :)
如果你有一台大内存的服务器,同时对 Win32 操作系统中对于进程最高使用 2G 内存的限制很郁闷,可选的解决方法有两个:
1 、使用 /3GB 模式启动计算机,方法参加文后的链接
2 、使用 Windows Server 2003 64bits Edition
实际上,在 ASP.NET Web 服务器上, ASP.NET 所能够用到的内存,通常不会等同于所有的内存数量。在 machine.config 配置文件中, 配置节<processModel>中有一个属性 “memoryLimit” ,这个属性的值是一个百分值,默认为 “60” ,即指定了 ASP.NET 进程(在任务管理器中大家就可以看到 ASP.NET 的进程, IIS5 中为 aspnet_wp , IIS6 中为 w3wp )能够使用所有物理内存的 60% 。当 ASP.NET 使用的内存量超过这个限额时, IIS 会开始自动回收( recycle )进程,即创建一个新的进程去负责应付 Http 请求,而将旧进程所占用的内存回收。
当我们有一台很大内存的服务器时, “memoryLimit” 这个值是需要进行适当的调整的。比如我们准备了一台 4G 内存的服务器,那么 4G ×60% = 2.4G 。但是,对于 Win32 操作系统,一个进程所能占用的所有内存空间只有 2G 。当 ASP.NET 进程占用的内存开始达到 2G 时,由于它并没有达到 2.4G 的 “ 回收阈值 ” ,所以 IIS 不会启动 recycle 进程操作,但是由于 Win32 的限制,实际上已经不能给这个进程分配更多的内存了,于是, OutOfMemoryException 就很可能会被抛出了。为了避免这样的情况,我们就必须将 “memoryLimit” 适当调小,以让 IIS 更早的进行进程回收。
微软推荐的 ASP.NET 进程占用内存是不超过 60% ,并最好使计算出的实际值不超过 800M 。就是说,对于一台 4G 内存的服务器,最好将 “memoryLimit” 属性设置成 “20” 。设置一个适当的回收阈值,让 IIS 适时的进行进程回收,对于保证整个服务器的稳定运行,避免 OutOfMemoryException 是非常重要的。
在 IIS6 中, ASP.NET 进程的回收阈值不再由 配置节中的 “memoryLimit” 属性决定,而是由 IIS 管理器中的应用程序池配置中的设置决定。
但是,即使正确设置了这些配置,也不能保证完全避免 OutOfMemoryException 的发生,原因可能是多样而复杂的,比如内存回收操作可能耗时太多等等。开发人员要注意的,就是在代码中时刻牢记不要无谓的使用和浪费内存。 :)
如果你有一台大内存的服务器,同时对 Win32 操作系统中对于进程最高使用 2G 内存的限制很郁闷,可选的解决方法有两个:
1 、使用 /3GB 模式启动计算机,方法参加文后的链接
2 、使用 Windows Server 2003 64bits Edition