即使是一个非常简单的请求,我的c# API也会被不必要的byte[]字符串填充。而且我真的找不到任何地方我认为会有内存泄漏。
- 一点描述:*
该方法从用户收集所有笔记本并返回它们。它通过BearerToken识别用户。
- 下面是被调用的代码,但是每个请求都会消耗几kb的内存,并且永远不会释放:*
GetCurrentUser:
public static async Task<UserModel?> GetCurrentUser(DataBaseContext _db, string bearerToken)
{
//get from the bearer token the username
//create jwt token
var token = new JwtSecurityToken(jwtEncodedString: bearerToken);
//get the expiry from the token
var userName = token.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value;
//get the whole user form the db
var user = _db.User
.Include(x => x.Invoices)
.Include(x => x.Notebook)
.Include(x => x.Logins)
.FirstOrDefaultAsync(x => x.Username == userName);
return await user;
}
字符串
GetCurrentUser & GetAll
private async Task<UserModel?> GetCurrentUser()
{
// Get the bearer token from the header
var bearerToken = HttpContext.Request.Headers["bearerToken"].ToString();
var user = await UserCore.GetCurrentUser(_db, bearerToken);
return user;
}
[HttpGet]
[Route("GetAll")]
public async Task<IActionResult> GetAll()
{
//set the users traceId
Guid traceId = Guid.NewGuid();
//get the user
var user = await GetCurrentUser();
if (user == null)
return new BadRequestObjectResult(ResponseMgr.CreateResponse(400, traceId, "The user does not exist"));
//get all notes
var notes = user.Notebook.ToList();
//return all notes
return new OkObjectResult(ResponseMgr.CreateResponse(200, traceId, "All notes", new Dictionary<string, object> { { "notes", notes } }));
}
型
- 这是堆图:*
x1c 0d1x的数据
的
这是我不明白的事情之一,这是“重复字符串”的列表,第一列是“值”,第二列是“浪费”,第三列是“计数”,底部是“总数”
问题是,表情符号是一个笔记本的内容/价值,但为什么它保留数据,而不是在请求后释放它们,所以总结一下,我发现了泄漏,但没有发现它发生的地方。
的
总之,我找不到位置,如果我发出50次请求,那么API会消耗几MB的内存,即使GC做不到,他们也会释放。
1条答案
按热度按时间enyaitl31#
1.你的代码也有另一个问题。当
username
为空时,不需要检查它,查询null
成员只需要返回null
1.你使用更多的
.Include()
,如果其中一个是大量的数据,你会有问题(你返回List
项,尝试用另一个更好的查询获取那里的数据)1.使用
AsNoTracking()
是指:
返回一个新查询,而实体没有保存在缓存中,意味着没有跟踪,查询将从数据库源读取,但不会保存在上下文中