C#3.5服务器内存不足(OOM)

时间:2014-05-16 15:13:10

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

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

问题

  1. 我是否真的需要手动调用FileUpload.FileContent.Close()和FileUpload.FileContent.Dispose(),如下面的finally子句?它能帮助解决上述问题吗?的 ==>答案:是

  2. 如果我这样做,它会搞乱清理过程吗? 框架使用的临时文件?的 ==>答案:否

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

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

        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;
        }
    

1 个答案:

答案 0 :(得分:0)

使用资源完成后,应始终调用Dispose。这释放了其他应用程序使用的内部资源。

调用Dispose不会释放内存。

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