asp.net C# API中的内存泄漏

0kjbasz6  于 2023-08-08  发布在  .NET
关注(0)|答案(1)|浏览(201)

即使是一个非常简单的请求,我的c# API也会被不必要的byte[]字符串填充。而且我真的找不到任何地方我认为会有内存泄漏。

  • 一点描述:*

该方法从用户收集所有笔记本并返回它们。它通过BearerToken识别用户。

  • 下面是被调用的代码,但是每个请求都会消耗几kb的内存,并且永远不会释放:*
    GetCurrentUser:
  1. public static async Task<UserModel?> GetCurrentUser(DataBaseContext _db, string bearerToken)
  2. {
  3. //get from the bearer token the username
  4. //create jwt token
  5. var token = new JwtSecurityToken(jwtEncodedString: bearerToken);
  6. //get the expiry from the token
  7. var userName = token.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value;
  8. //get the whole user form the db
  9. var user = _db.User
  10. .Include(x => x.Invoices)
  11. .Include(x => x.Notebook)
  12. .Include(x => x.Logins)
  13. .FirstOrDefaultAsync(x => x.Username == userName);
  14. return await user;
  15. }

字符串

GetCurrentUser & GetAll

  1. private async Task<UserModel?> GetCurrentUser()
  2. {
  3. // Get the bearer token from the header
  4. var bearerToken = HttpContext.Request.Headers["bearerToken"].ToString();
  5. var user = await UserCore.GetCurrentUser(_db, bearerToken);
  6. return user;
  7. }
  8. [HttpGet]
  9. [Route("GetAll")]
  10. public async Task<IActionResult> GetAll()
  11. {
  12. //set the users traceId
  13. Guid traceId = Guid.NewGuid();
  14. //get the user
  15. var user = await GetCurrentUser();
  16. if (user == null)
  17. return new BadRequestObjectResult(ResponseMgr.CreateResponse(400, traceId, "The user does not exist"));
  18. //get all notes
  19. var notes = user.Notebook.ToList();
  20. //return all notes
  21. return new OkObjectResult(ResponseMgr.CreateResponse(200, traceId, "All notes", new Dictionary<string, object> { { "notes", notes } }));
  22. }

  • 这是堆图:*

x1c 0d1x的数据



这是我不明白的事情之一,这是“重复字符串”的列表,第一列是“值”,第二列是“浪费”,第三列是“计数”,底部是“总数”
问题是,表情符号是一个笔记本的内容/价值,但为什么它保留数据,而不是在请求后释放它们,所以总结一下,我发现了泄漏,但没有发现它发生的地方。


总之,我找不到位置,如果我发出50次请求,那么API会消耗几MB的内存,即使GC做不到,他们也会释放。

enyaitl3

enyaitl31#

1.你的代码也有另一个问题。当username为空时,不需要检查它,查询null成员只需要返回null
1.你使用更多的.Include(),如果其中一个是大量的数据,你会有问题(你返回List项,尝试用另一个更好的查询获取那里的数据)
1.使用AsNoTracking()
是指:
返回一个新查询,而实体没有保存在缓存中,意味着没有跟踪,查询将从数据库源读取,但不会保存在上下文中

相关问题