1. 微服务技术栈
| 编号 | 技术架构 | 版本 | 作用 | 备注 |
|---|---|---|---|---|
| 1 | CSharp | .Net5.0 | 底层编译执行平台 | 开发语言 |
| 2 | GraphQL | 3.3.1 | 通讯协议 | 服务间接口 |
| 3 | Microsoft.EntityFrameworkCore | 5.0.3 | 持久层 | |
| 4 | Pomelo.EntityFrameworkCore.MySql | 5.0.0-alpha.2 | Mysql交互层 | |
| 5 | Jaeger | 0.4.2 | 链路追踪 | |
| 6 | MethodBoundaryAspect.Fody | 2.0.138 | AOP层 | .Net AOP相对弱 |
| 7 | Microsoft.Extensions.Diagnostics.HealthChecks | 5.0.2 | 心跳检查 | |
| 8 | Microsoft.Extensions.Logging.Log4Net.AspNetCore | 5.0.0 | 日志记录 | |
| 9 | postjson.com/ | 在线post在线get | 接口测试 |
2. 发生现象
2.1 启动内存占有量:111M
2.2 第4次请求结束,内存占有量:946M
可以明显看出占有量前三甲:Redis,Jaeger, Dictionary
2.3 第5次订正、删除请求结束,内存占有量:1G以上
可以明显看出占有量前三甲:Redis,Jaeger, Dictionary
2.4 随着请求量的增加,对内存消耗量不段加大
如何回收内存,释放对象成了重中之重
3.释放对象
3.1 释放Task对象
注意:Task.Run谨慎使用
收集所有Task的点,进行等待执行完毕,如下:
var tasks = new List<Task>();
var task = Task.Run(() =>{
..........
});
tasks.add(task);
//不带参数的返回值
return Task.WhenAll(tasks);
//带参数的返回值
//return Task.FromResult(0);
3.2 释放Linq对象
注意加.AsNoTracking()
from m in dbContext.Set<Item>().AsNoTracking().Where(..
3.3 释放用完的List对象
List<Item> list = new();
....
//使用完后,注意清除对象
}finally{
list.clear();
}
3.4 释放DBContext对象
//DB上下文定时,注意析构函数
public class AbcDbContext:DbContext{
public override void Dispose()
{
this.Dispose(true);
GC.Collect();
GC.SuppressFinalize(this);
}
}
//调用的类
_abcDbContext.Dispose();
_abcDbContext = null;