首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET网站内存使用率很高

ASP.NET网站内存使用率很高
EN

Stack Overflow用户
提问于 2010-08-04 20:41:48
回答 6查看 20.1K关注 0票数 20

我有一个ASP.NET网站,它将在大约3-4天内占用大约2 2gb的物理内存,对我来说这听起来真的很糟糕。目前,我已经将IIS配置为在达到500mb时重新启动应用程序池进程。我想试着追查这个问题。

在.NET中创建对象的新实例时,我的印象是不需要释放它,因为.NET垃圾收集器将为我做这件事。

这是真的吗,或者这可能是我遇到问题的原因之一?

EN

回答 6

Stack Overflow用户

发布于 2010-08-04 20:51:54

内存使用率高的原因可能有很多,但.NET中的垃圾回收是一个非常精确的东西。也就是说,它为您做了很多事情,但有时并不像您预期的那样多。

具体地说,它只能清理没有活动引用的对象,所以如果您已经处理完一个类,但仍然有一个对它的引用,那么您将需要删除该引用,以便GC可以为您恢复该内存。此外,如果您有任何非活动的打开连接(例如,到数据库或其他东西),不要忘记关闭并清除它们。通常,我们将这样的对象包装在using块中,如下所示:

代码语言:javascript
复制
using(SqlConnection conn = new SqlConnection(myConnString))
{ ...rest of code here }

这将自动关闭并释放连接。这是作为try...finally块实现的,因此即使在using块中抛出异常,连接也会关闭。

除此之外,答案是"profile,profile,profile“,直到你找到你的漏洞/瓶颈/任何东西。

票数 6
EN

Stack Overflow用户

发布于 2010-08-04 20:56:46

有几件事你应该看一看:

首先,你在使用会话吗?它们是在proc会话中还是在SQL会话中?如果它们正在处理中,那么超时设置为多少?如果你有一个非常长的超时,这可以解释为什么你使用这么多的内存(用户会话将存储很长时间)。

第二,对象的处理。.NET垃圾回收器将为您清除引用,但是当您创建实现IDisposable接口的对象时,应该始终使用using关键字。

代码语言:javascript
复制
using(Foo foo = new Foo())
{
    ...
}

等同于做:

代码语言:javascript
复制
Foo foo;
try
{
    foo = new Foo();
    ...
}
finally
{
    foo.Dispose();
}

它将确保你有效地处理你的对象。

如果您仍然无法在代码中找到任何明显的东西,您可以分析它,从调用次数最多的方法开始。你可以找到关于好的分析器here的信息。这肯定会让你找到问题的根源。

票数 3
EN

Stack Overflow用户

发布于 2010-08-04 20:53:51

.NET中的内存泄漏仍然是可能的。的确,在大多数情况下,您不需要释放对象(有一些例外,如Graphics对象),但如果您保留对它们的引用,它们将不会被垃圾回收,因为它们仍然被引用。

如果GC发现应用程序中的某处、任何位置引用了某个对象,它不会将其丢弃。

查看这篇关于.NET内存泄漏以及如何定位和修复它们的Code Project文章。

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

https://stackoverflow.com/questions/3405557

复制
相关文章

相似问题

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