我的基于LLBLGen的大型32位web服务数据访问应用程序在一台专用的64位计算机上单独运行。当进程释放几乎所有分配的空间(最多1,5 2GB )时,它的物理内存消耗稳定地增长到大约2 2GB,并从这一点开始继续增长。页面输入值或其他页面文件使用参数没有明显增加,因此看起来内存被释放了,而不是换出到页面文件。我在想这是一种什么样的个人资料?实际上,没有什么可以阻止进程抓取它能抓取的所有内存,另一方面,在内存释放周围有不可接受的http内部错误-可能是清理块有用的工作。考虑到上述行为是一种可接受的行为,什么才是使清理工作不那么引人注目的好策略。
发布于 2008-11-10 16:01:27
这听起来像是发生了内存泄漏,进程不断地泄漏内存,直到它因内存不足而崩溃,然后由服务器自动重新启动。
在地址空间耗尽之前,1.5 32大约是32位进程可以分配的最大内存量。
需要寻找的东西:
类)?分配到那里的任何东西都不会被垃圾收集器释放,你必须自己释放它。
发布于 2008-11-10 14:59:53
有没有可能你没有处理各种一次性的对象(特别是与数据库相关的)。这将留下它们,可能会占用大量的非托管资源,直到GC运行并调用它们的终结器。
有必要针对您的进程运行perfmon,并查看一些关键资源(如句柄)是否有稳定的增长,或者您的DB提供程序是否公开性能计数器然后连接或打开结果集。
发布于 2008-11-10 15:01:01
我同意edg回答的第一部分,但他说:
“通过在对象死亡时将其设置为null,您可以鼓励GC重用由这些对象消耗的内存,这限制了不断增长的内存消耗。”
是不正确的。您永远不需要将对象设置为null,因为在对象超出作用域之后,GC最终会收集该对象。
这在SO上的回答中已经讨论过了:Setting Objects to Null/Nothing after use in .NET
https://stackoverflow.com/questions/277925
复制相似问题