2017-08-29 13 views
-1

私はステートレスなAsp.Net Core REST Web APIを持っていますが、それはメモリリークを持っているようです...私には奇妙に思えますが、証拠はかなり魅力的です。ステートレスREST APIはどのようにしてメモリリークを起こすことができますか?

http://prntscr.com/ge9k2l

これはゆっくりと上がってRAMを示す私のAzureポータルのスクリーンショットです。

私の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から関数の1つだけを表示しているときに、完全なAPIを投稿しない限り、メモリリークがあるかどうかを判断することは不可能です。 – Gusman

+1

プログラムが最終的にクラッシュするか、例外がスローされますか?ダンプファイルを作成して、何がすべてのメモリを使用しているか確認できますか?あなたのスクリーンショットから、それは大幅に増加したようには見えません。 – Xela

答えて

0

[OK]を...ので、ケースには誰もが将来的にこのに走る...メモリリンクは設定の問題であることが判明しました。私はconfigオブジェクトをあまりにも頻繁にインスタンス化していました。彼らは手放されていませんでした...

最終的な解決策は、設定用のシングルトンを作成することでした。あなたはここで解決見ることができます:

ASP.Net Core 2 configuration taking up a lot of memory. How do I get config information differently?

関連する問題