khaleelsyed Ответов: 1

Как определить утечку памяти в приложении .NET


Привет ,

Я дал проект, чтобы определить первопричину утечек памяти в веб-приложении на основе .net.

Это первый раз, когда я дал такое задание. Я не знаю, как искать утечки памяти, любые предложения, пожалуйста.

Я обновил свой вопрос с помощью блока кода, приведет ли этот блок кода к какой-либо утечке памяти.
Может ли кто-нибудь просмотреть блок кода и предоставить некоторую информацию о строке кода, которая может вызвать утечку памяти, если таковая имеется.

Что я уже пробовал:

проверка наличия статических классов и использование диагностических средств, предоставляемых visual studio 2019

<pre>[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult SaveFileData(FileEdit model)
        {
            var file = new File();
            EntityMapper<FileEdit, File>.Map(model, file);
            string fileName = string.Empty;
            string relativePath = string.Empty;
            string extension = string.Empty;

            file.SchoolId = SessionHelper.CurrentSession.SchoolId;
            file.IsActive = true;
            bool result = false;
            if (model.PostedFile != null)
            {
                fileName = model.PostedFile.FileName;
                extension = Path.GetExtension(model.PostedFile.FileName).Replace(".", "");


                //string resourceDir = Server.MapPath(Constants.ResourcesDir);
                //string fileContent = Server.MapPath(Constants.FileDir);
                //string fileModule = Server.MapPath(Constants.BlogDir + "/Module_" + model.ModuleId);
                //string filePath = Server.MapPath(Constants.BlogDir + "/Module_" + model.ModuleId + "/User_" + SessionHelper.CurrentSession.Id);


                string resourceDir = MyConfiguration.Instance.WriteFilePath + Constants.ResourcesDir;
                string fileContent = MyConfiguration.Instance.WriteFilePath + Constants.FileDir;
                string fileModule = MyConfiguration.Instance.WriteFilePath + Constants.FileDir + "/Module_" + model.ModuleId;
                string filePath = MyConfiguration.Instance.WriteFilePath + Constants.FileDir + "/Module_" + model.ModuleId + "/User_" + SessionHelper.CurrentSession.Id;

                Common.Helpers.CommonHelper.CreateDestinationFolder(resourceDir);
                Common.Helpers.CommonHelper.CreateDestinationFolder(fileContent);
                Common.Helpers.CommonHelper.CreateDestinationFolder(fileModule);
                Common.Helpers.CommonHelper.CreateDestinationFolder(filePath);
                fileName = Guid.NewGuid() + "_" + fileName;
                relativePath = Constants.FileDir + "/Module_" + model.ModuleId + "/User_" + SessionHelper.CurrentSession.Id + "/" + fileName;

                var extId = _fileTypeList.FirstOrDefault(r => r.Extension.Contains(extension.ToLower())).TypeId;

                fileName = Path.Combine(filePath, fileName);

                model.PostedFile.SaveAs(fileName);
                file.FileName = model.PostedFile.FileName;
                file.FilePath = relativePath;
                file.FileTypeId = extId;
                file.FolderId = !string.IsNullOrWhiteSpace(model.ParentFolderId) ? Convert.ToInt32(EncryptDecryptHelper.DecryptUrl(model.ParentFolderId)) : 0;
                file.SectionId = !string.IsNullOrWhiteSpace(model.SectId) ? Convert.ToInt32(EncryptDecryptHelper.DecryptUrl(model.SectId)) : 0;

                if (model.FolderId > 0)
                {
                    file.UpdatedBy = SessionHelper.CurrentSession.Id;
                    result = _fileService.Update(file);
                }
                else
                {
                    file.CreatedBy = SessionHelper.CurrentSession.Id;
                    result = _fileService.Insert(file);
                }
                return Json(new OperationDetails(result), JsonRequestBehavior.AllowGet);
            }
            return Json(new OperationDetails(result), JsonRequestBehavior.AllowGet);
        }

1 Ответов

Рейтинг:
11

RickZeeland

Вот обзор бесплатных .NET-профайлеров: Лучшие-бесплатные-сетевые-профилировщики[^]

См. статьи CodeProject: Простое обнаружение утечек памяти[^]
И: Лучшие Практики № 5: Обнаружение .Чистые утечки памяти приложений[^]

А эта статья: Отладка трудно воспроизводимых проблем[^]

Если вы готовы потратить немного денег, то Торговый центр SciTech отладчик это хороший выбор: Улучшите свой опыт отладки Visual Studio с помощью .NET Memory Profiler[^]

Рекомендуется использовать оператор using: использование инструкции - Справочник по C# | Microsoft Docs[^]
Некоторые объекты также могут нуждаться в утилизации, см.: Dispose и Finalize в C# с примерами и примерами использования[^]


khaleelsyed

Спасибо за ваш ответ и предложенные ссылки

khaleelsyed

я обновил свой вопрос и добавил некоторый блок кода, который содержит логику загрузки файлов, пожалуйста, просмотрите строки кода и обновите их, если возникнут какие-либо проблемы с кодом, которые могут вызвать утечку памяти.

RickZeeland

Я не вижу никаких конструкций с использованием {} в вашем коде, может быть, это поможет. Какую картографическую структуру вы используете ?

khaleelsyed

означает, что использование using {} может решить проблему утечки памяти, никаких других изменений не требуется?

RickZeeland

Может быть, при использовании using (ха-ха) вы уверены, что используемый объект будет утилизирован. Я обновлю решение с помощью некоторых ссылок.