私はステートレスなAsp.Net Core REST Web APIを持っていますが、それはメモリリークを持っているようです...私には奇妙に思えますが、証拠はかなり魅力的です。ステートレスREST APIはどのようにしてメモリリークを起こすことができますか?
これはゆっくりと上がって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);
}
}
あなたはそれがメモリリークだ確認することができない、ガベージコレクタは、それが十分なリソースを持っている場合、オブジェクトを削除しないことを決定することができます。それぞれの戻り値の前に 'GC.Collect()'を宣言し、テストをもう一度行います。 – Gusman
また、apiから関数の1つだけを表示しているときに、完全なAPIを投稿しない限り、メモリリークがあるかどうかを判断することは不可能です。 – Gusman
プログラムが最終的にクラッシュするか、例外がスローされますか?ダンプファイルを作成して、何がすべてのメモリを使用しているか確認できますか?あなたのスクリーンショットから、それは大幅に増加したようには見えません。 – Xela