【问题标题】:C# 3.5 Server Out of Memory (OOM)C# 3.5 服务器内存不足 (OOM)
【发布时间】:2014-07-05 02:44:43
【问题描述】:

场景 我正在使用带有 .NET framework 2.0* 的 C# Webforms(项目是 3.5,但 IIS 只有 2.0)。我有一个简单的表单,可以获取一些用户的信息和文件(PDF、gif 等)并将它们发送到另一个应用程序。很简单。问题是最终有很多人(超过 1000 人)试图同时访问它,并且 IIS 进程的内存使用量激增,导致应用程序崩溃。我们正在尝试改进基础设施(更多内存、网络农场等),但我想知道:

问题

  1. 我真的需要像下面的 finally 子句那样手动调用 FileUpload.FileContent.Close() 和 FileUpload.FileContent.Dispose() 吗?它可以帮助解决上述问题吗? ==> 回答:是的

  2. 如果我这样做,会不会弄乱 框架使用的临时文件? ==> 回答:否

  3. 我还能做些什么来避免这个问题?现在,我将尝试按照以下文章更改 Webconfig:http://support.microsoft.com/kb/821268/en-us AND http://www.codeproject.com/Articles/23306/ASP-NET-Performance-and-Scalability-Secrets

代码 这是我使用 FileUpload.SaveAs() 的代码片段。它基本上获取生成的和已经验证的信息(文件名、扩展名等)并使用它来保存文件上传的文件内容。

    private bool GravarArquivo(FileUpload fileUpload, eXML.Anexo anexo)
    {
        bool sucesso = false;
        if (AnexoValido(fileUpload, anexo))
        {
            string path = Server.MapPath(bllProcesso.GetUrlArquivo(anexo.NomeArquivoFisico));
            try
            {
                //GRAVA ARQUIVO
                fileUpload.SaveAs(path);
                sucesso = true;
            }
            catch (Exception ex)
            {
                string mensagem = String.Format("Erro ao tentar salvar o arquivo '{0}'. Exception: '{1}'", anexo.NomeArquivoFisico, ex.Message);
                MostrarAlerta(this, mensagem);
                //throw new Exception(mensagem, ex);
            }
            //TODO: ESTUDAR O USO DESTE FINALLY, PARA VER SE DIMINUI O PROBLEMA DE MEMÓRIA DO SERVIDOR
            //finally
            //{
            //    fileUpload.FileContent.Close();
            //    fileUpload.FileContent.Dispose();
            //}
        }
        return sucesso;
    }

【问题讨论】:

  • 简短回答,是的。见this question
  • @Joe - tahnks。但是 FileUpload 的临时文件呢?这不会弄乱清理过程吗?

标签: c# file-upload memory-leaks garbage-collection asp.net-3.5


【解决方案1】:

您应该始终在使用完资源后调用 Dispose。这释放了它的内部资源供其他应用程序使用。

调用 Dispose 不会释放内存。

如果您不调用 Dispose,它将在未来某个不确定的时间自动调用。

【讨论】:

  • 感谢您的回答。但是我真的可以调用 FileUpload.FileContent.Dispose() 吗?我真的不知道框架如何处理 FileUpload。我知道某处有一个临时文件, FileUpload.FileContent.SaveAs() 只需将其复制到所需位置。但是如果我调用这个 Dispose() 不会搞砸清理临时文件的过程,不管这个过程是什么?
  • 是的,您可以安全地调用 Dispose。操作系统处理 Temp 文件,而不是 .NET
  • 谢谢您,先生。顺便问一下,您还有什么其他建议可以帮助您在软件中做些什么来最大程度地减少所描述的问题?
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 2019-05-14
  • 1970-01-01
  • 2012-05-06
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多