2017-08-29 27 views
-1

所以我有一个无状态的Asp.Net核心REST Web API,似乎有内存泄漏......这对我来说似乎很陌生,但证据非常引人注目。无状态REST API如何发生内存泄漏?

http://prntscr.com/ge9k2l

这是我的天青门户网站的显示RAM慢慢往上走的屏幕截图。

现在我的API是非常标准的...... CRUD,大量的数据检索......没有太多疯狂的逻辑或任何东西,但它获得了大量的流量(平均每秒约17个请求)。最终服务器到了必须重新启动的地步,以便释放内存。

下面是一个典型的保存方法...

同样,API是无状态的,所以我真的不缓存或不放任何数据......只是做我必须做的,并给回数据。

想法?

[HttpPost] 
    public IActionResult Save([FromBody]QuizViewModel quiz) 
    { 
     if (ValidateAdmin() == null) 
      return StatusCode(401); 

     try 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      Quiz dbQuiz = null; 

      if (quiz.ID == new Guid()) 
      { 
       LogInfo("Saving new quiz: Name [" + quiz.Name + "]"); 

       // new 
       dbQuiz = new Quiz(); 
       dbQuiz.ID = Guid.NewGuid(); 
       dbQuiz.CreatorID = quiz.CreatorID; 
       dbQuiz.CreateDate = DateTime.UtcNow; 
       _quizRepository.Add(dbQuiz); 
      } 
      else 
      { 
       LogInfo("Updating quiz: ID [" + quiz.ID + "], Name: [" + quiz.Name + "]"); 
       // update 
       dbQuiz = _quizRepository.GetSingle(x => x.ID == quiz.ID, y => y.Questions); 
       dbQuiz.UpdateDate = DateTime.UtcNow; 
       dbQuiz.UpdaterID = quiz.CreatorID; 
      } 

      _quizRepository.ManageQuestions(dbQuiz, quiz.Questions); 

      dbQuiz.Name = quiz.Name; 
      dbQuiz.LessonID = quiz.LessonID; 
      dbQuiz.Instructions = quiz.Instructions; 
      dbQuiz.ImagePath = quiz.ImagePath; 
      dbQuiz.VideoPath = quiz.VideoPath; 

      _quizRepository.Commit(); 

      quiz = Mapper.Map<Quiz, QuizViewModel>(dbQuiz); 

      CreatedAtRouteResult result = CreatedAtRoute("Save", new { controller = "Quiz", ID = quiz.ID }, quiz); 

      LogInfo("Quiz saved: ID [" + dbQuiz.ID + "]"); 
      return new OkObjectResult(result); 
     } 
     catch (Exception ex) 
     { 
      HandleError(ex); 
      return BadRequest(ex); 
     } 
    } 
+1

你不能肯定这是内存泄漏,垃圾收集器可以决定不删除的对象,如果它有足够的资源。在每次返回之前添加一个'GC.Collect()'并再次执行测试。 – Gusman

+0

另外,除非你发布完整的API,否则不可能确定是否存在内存泄漏,因为你只显示api中的一个函数。 – Gusman

+1

程序是否最终崩溃或抛出异常?你可以创建一个转储文件并检查所有内存的使用情况吗?从你的截图看,它看起来不像是一个显着的增加。 – Xela

回答