[英]Garbage collector not getting called in .NET Core API?
我使用郵遞員連續調用了大約 100 次 API 方法。 運行兩次后,內存圖從 100mb 變為 400mb。 整個過程中沒有一個黃色標記:
然后我在控制器中添加了這兩行:
GC.Collect(2, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
圖形看起來:
此外,內存消耗沒有增加超過 150mb
這可能是什么原因?
下面幾行實際上做了什么? 我們正面臨內存泄漏。
GC.Collect(2, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
控制器有一個調用服務層的操作方法,該服務層調用數據訪問層,如下所示:
public async Task<PackingSlips> GetAllPackingSlipsByStatus(long statusCode, int offset, int fetch)
{
using (SqlConnection sqlConnection = (SqlConnection)sqlHelper.CreateConnection())
{
PackingSlips packingSlips = new PackingSlips();
List<PackingSlipDetails> packingSlipDetailsList = new List<PackingSlipDetails>();
sqlConnection.Open();
SqlCommand cmd = new SqlCommand(Constants.GetAllPackingSLipsByStatus, sqlConnection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@CreatedBy", SqlDbType.NVarChar).Value = _gepservice.GetUserContext().UserId;
cmd.Parameters.Add("@DocumentStatus", SqlDbType.Int).Value = statusCode;
cmd.Parameters.Add("@OffsetRows", SqlDbType.NVarChar).Value = offset;
cmd.Parameters.Add("@FetchRows", SqlDbType.NVarChar).Value = fetch;
var refCountdr = (RefCountingDataReader)(await sqlHelper.ExecuteReaderAsync(cmd));
var sqlDr = (SqlDataReader)refCountdr.InnerReader;
if (sqlDr != null)
{
while (sqlDr.Read())
{
PackingSlipDetails packingSlipDetails = new PackingSlipDetails
{
Id = Convert.ToInt32(sqlDr[Constants.Id]),
FileName = Convert.ToString(sqlDr[Constants.FileName]),
FileUri = Convert.ToString(sqlDr[Constants.FileURI]),
PONumber = Convert.ToString(sqlDr[Constants.DocumentNumber]) == Constants.Zero ? "-" : Convert.ToString(sqlDr[Constants.DocumentNumber]),
UploadDate = Convert.IsDBNull(sqlDr[Constants.UploadDate]) ? DateTime.UtcNow : Convert.ToDateTime(sqlDr[Constants.UploadDate]),
FileStatus = (Convert.ToInt16(sqlDr[Constants.FileStatus])),
ReceiptNumber = Convert.ToString(sqlDr[Constants.ReceiptNumber]),
CreatedBy = _gepservice.GetUserContext().UserId
};
if (packingSlipDetails.PONumber == null || packingSlipDetails.PONumber == "")
packingSlipDetails.PONumber = "-";
packingSlipDetailsList.Add(packingSlipDetails);
packingSlips.TotalRows = Convert.ToInt32(sqlDr[Constants.TotalRows]);
}
}
packingSlips.PackingSlipDetails = packingSlipDetailsList;
return packingSlips;
}
}
我使用郵遞員連續調用了大約 100 次 API 方法。 運行兩次后,內存圖從 100mb 變為 400mb。 整個過程中沒有一個黃色標記:
然后我在控制器中添加了這兩行:
GC.Collect(2, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
圖形看起來:
此外,內存消耗沒有增加超過 150mb
這可能是什么原因?
下面幾行實際上做了什么? 我們正面臨內存泄漏。
GC.Collect(2, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();
控制器有一個調用服務層的操作方法,該服務層調用數據訪問層,如下所示:
public async Task<PackingSlips> GetAllPackingSlipsByStatus(long statusCode, int offset, int fetch)
{
using (SqlConnection sqlConnection = (SqlConnection)sqlHelper.CreateConnection())
{
PackingSlips packingSlips = new PackingSlips();
List<PackingSlipDetails> packingSlipDetailsList = new List<PackingSlipDetails>();
sqlConnection.Open();
SqlCommand cmd = new SqlCommand(Constants.GetAllPackingSLipsByStatus, sqlConnection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@CreatedBy", SqlDbType.NVarChar).Value = _gepservice.GetUserContext().UserId;
cmd.Parameters.Add("@DocumentStatus", SqlDbType.Int).Value = statusCode;
cmd.Parameters.Add("@OffsetRows", SqlDbType.NVarChar).Value = offset;
cmd.Parameters.Add("@FetchRows", SqlDbType.NVarChar).Value = fetch;
var refCountdr = (RefCountingDataReader)(await sqlHelper.ExecuteReaderAsync(cmd));
var sqlDr = (SqlDataReader)refCountdr.InnerReader;
if (sqlDr != null)
{
while (sqlDr.Read())
{
PackingSlipDetails packingSlipDetails = new PackingSlipDetails
{
Id = Convert.ToInt32(sqlDr[Constants.Id]),
FileName = Convert.ToString(sqlDr[Constants.FileName]),
FileUri = Convert.ToString(sqlDr[Constants.FileURI]),
PONumber = Convert.ToString(sqlDr[Constants.DocumentNumber]) == Constants.Zero ? "-" : Convert.ToString(sqlDr[Constants.DocumentNumber]),
UploadDate = Convert.IsDBNull(sqlDr[Constants.UploadDate]) ? DateTime.UtcNow : Convert.ToDateTime(sqlDr[Constants.UploadDate]),
FileStatus = (Convert.ToInt16(sqlDr[Constants.FileStatus])),
ReceiptNumber = Convert.ToString(sqlDr[Constants.ReceiptNumber]),
CreatedBy = _gepservice.GetUserContext().UserId
};
if (packingSlipDetails.PONumber == null || packingSlipDetails.PONumber == "")
packingSlipDetails.PONumber = "-";
packingSlipDetailsList.Add(packingSlipDetails);
packingSlips.TotalRows = Convert.ToInt32(sqlDr[Constants.TotalRows]);
}
}
packingSlips.PackingSlipDetails = packingSlipDetailsList;
return packingSlips;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.