【问题标题】:Web application use too much memoryWeb 应用程序使用过多内存
【发布时间】:2014-03-26 18:48:10
【问题描述】:

在我的托管公司,我有 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 Memory profiler 8 并在构建后一次刷新起始页时得到此结果:

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

我应该从哪里开始?使用这么多内存可能是什么问题? 300 mb 内存不足吗?

【问题讨论】:

  • 这完全取决于你的代码在做什么。确保你在所有事情上都调用Dispose。如果您有数据库连接,请确保关闭 Dispose 链中的那些。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有一些数据库连接没有被释放。然后我有一个删除 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 会解决这个问题还是我应该以其他方式解决?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多