-1
所以我有一个无状态的Asp.Net核心REST Web API,似乎有内存泄漏......这对我来说似乎很陌生,但证据非常引人注目。无状态REST API如何发生内存泄漏?
这是我的天青门户网站的显示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);
}
}
你不能肯定这是内存泄漏,垃圾收集器可以决定不删除的对象,如果它有足够的资源。在每次返回之前添加一个'GC.Collect()'并再次执行测试。 – Gusman
另外,除非你发布完整的API,否则不可能确定是否存在内存泄漏,因为你只显示api中的一个函数。 – Gusman
程序是否最终崩溃或抛出异常?你可以创建一个转储文件并检查所有内存的使用情况吗?从你的截图看,它看起来不像是一个显着的增加。 – Xela