Web API 2.0 方法中的内存泄漏
Memory leak in web API 2.0 method
我们项目中有一个webAPI,很简单,但是执行后不释放内存,每次执行都会增加使用的内存。
我使用 webAPI 2.0 和 MongoDB 作为后端服务器。
public class LogsController:ApiController
{
BsonDocument __docs;
IMongoDatabase __db;
IMongoCollection<BsonDocument> __docsColl;
[Route("api/Logs")]
public async Task<int> Post(RequestData logs)
{
if (logs.Token == "I")
{
__db = new MongoClient(new MongoClientSettings
{
Server = new MongoServerAddress("serverIP", 27017),
Credentials = new[] { MongoCredential.CreateCredential("database", "user name", "password") }
}).GetDatabase("connect_database");
__docs = new BsonDocument()
{
{ "Customer",logs.Customer}
};
__docsColl = __db.GetCollection<BsonDocument>("InsertData");
await __docsColl.InsertOneAsync(__docs);
}
logs = null;
return 1;
}
protected override void Dispose(bool disposing)
{
__docs = null;
__db = null;
__docsColl = null;
GC.SuppressFinalize(true);
base.Dispose(disposing);
}
}
我已经尝试了我找到的所有可能的解决方案,但到目前为止还没有成功。
在 LogsController
的构造函数中而不是在 Post
方法中初始化 MongoClient
。
当使用 post 参数调用 webAPI 时,它将反序列化为我们用作参数的 class。
进一步检查发现,当 class 内容为字符串数据类型时,它将使用内存,而不是在来自 webAPI 的响应 return 后一次释放。
如果您确实需要内存,那么您必须重写 ApiController 的 Dispose 方法。
代码块应该是:
protected override void Dispose(bool disposing)
{
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
base.Dispose(disposing);
}
GC.Collect 不是推荐的方法,但是当您 post 在参数中输入大量数据时,您必须需要快速使用它来释放内存。
我们项目中有一个webAPI,很简单,但是执行后不释放内存,每次执行都会增加使用的内存。
我使用 webAPI 2.0 和 MongoDB 作为后端服务器。
public class LogsController:ApiController
{
BsonDocument __docs;
IMongoDatabase __db;
IMongoCollection<BsonDocument> __docsColl;
[Route("api/Logs")]
public async Task<int> Post(RequestData logs)
{
if (logs.Token == "I")
{
__db = new MongoClient(new MongoClientSettings
{
Server = new MongoServerAddress("serverIP", 27017),
Credentials = new[] { MongoCredential.CreateCredential("database", "user name", "password") }
}).GetDatabase("connect_database");
__docs = new BsonDocument()
{
{ "Customer",logs.Customer}
};
__docsColl = __db.GetCollection<BsonDocument>("InsertData");
await __docsColl.InsertOneAsync(__docs);
}
logs = null;
return 1;
}
protected override void Dispose(bool disposing)
{
__docs = null;
__db = null;
__docsColl = null;
GC.SuppressFinalize(true);
base.Dispose(disposing);
}
}
我已经尝试了我找到的所有可能的解决方案,但到目前为止还没有成功。
在 LogsController
的构造函数中而不是在 Post
方法中初始化 MongoClient
。
当使用 post 参数调用 webAPI 时,它将反序列化为我们用作参数的 class。
进一步检查发现,当 class 内容为字符串数据类型时,它将使用内存,而不是在来自 webAPI 的响应 return 后一次释放。
如果您确实需要内存,那么您必须重写 ApiController 的 Dispose 方法。
代码块应该是:
protected override void Dispose(bool disposing)
{
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
base.Dispose(disposing);
}
GC.Collect 不是推荐的方法,但是当您 post 在参数中输入大量数据时,您必须需要快速使用它来释放内存。