Web应用程序使用太多内存

时间:2014-03-26 18:48:11

标签: c# asp.net memory memory-management

在我的主机公司,我有2个或多或少相同的.net应用程序。这两个应用程序使用相同的池,其最大内存为300 MB。

我可以刷新其中一个应用程序的起始页大约10次,然后我得到一个内存不足异常并且池崩溃了。

在我的应用程序中,我打印出这些内存值:
PrivateMemorySize64:197 804.00 kb(193.00 mb)
PeakPagedMemorySize64:247 220.00 kb(241.00 mb)
VirtualMemorySize64:27 327 128.00 kb(26 686.00 mb)
PagedMemorySize64:197 804.00 kb(193.00 mb)
PagedSystemMemorySize64:415.00 kb(0.00 mb)
PeakWorkingSet64:109 196.00 kb(106.00 mb)
WorkingSet64:61 196.00 kb(59.00 mb)
GC.GetTotalMemory(true):2 960.00 kb(2.00 mb)
GC.GetTotalMemory(false):2 968.00 kb(2.00 mb)

我已阅读,阅读和阅读有关内存分析的视频,但在对应用程序进行概要分析时,我无法发现任何问题。 我使用ANTS内存分析器8并在构建后刷新初始化一次时获得此结果: a http://oi60.tinypic.com/21l057c.jpg

当我查看摘要时,.NET正在使用为应用程序分配的41.65 MB的135.8 MB总私有字节。 每次刷新时,此值越来越大。这是正常的吗?当我刷新8次时,我得到这个: .NET正在使用为应用程序分配的56.11 MB的153 MB总私有字节。

我应该从哪里开始?使用这么多内存会有什么问题?内存是300 MB到低吗?

2 个答案:

答案 0 :(得分:1)

这无疑是由于代码中的内存泄漏,可能是因为没有处理/关闭与队列或数据库之类的连接。除了剖析,检查您的代码并确保您关闭/处置所有适当的资源:您的问题应该自行缓解。

答案 1 :(得分:0)

有一些数据库连接尚未处理。然后我有一个删除Etags的类,如下所示:

public class CustomHeaderModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Headers.Remove("ETag");
    }
}'

我必须删除我在Init功能中添加的新事件吗?或者GC会修复吗?

我有很多这个:

Task.Factory.StartNew(() =>
{
   Add(...);
});

但我不会将它们丢弃在我的代码中。 GC是否会以其他方式解决这个问题或应该做什么?

相关问题