簡體   English   中英

.NET Core API 中沒有調用垃圾收集器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM