亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么同一頁面的每個頁面加載后內存使用量都會增加

為什么同一頁面的每個頁面加載后內存使用量都會增加

C#
阿波羅的戰車 2023-09-24 17:22:03
我有一個簡單的視圖來顯示大約 2000 個客戶(尚未尋呼,這是我流程的下一步)。這是我的控制器部分:public class CustomersController : Controller{    private readonly MyModel _context;    public CustomersController(MyModel context)    {        _context = context;    } // GET: Customers    public async Task<IActionResult> Index()    {        var customers = await _context.Customers.ToListAsync();        return View(customers);    }}和一個簡單的視圖:@model IEnumerable<Customer>  @{ ViewData["Title"] = "Index"; }  <table class="table">    <thead>      <tr>        <th>          @Html.DisplayNameFor(model => model.Name)        </th>        <th></th>      </tr>    </thead>    <tbody>      @foreach (var item in Model) {      <tr>        <td>          @Html.DisplayFor(modelItem => item.Name)        </td>      </tr>      }    </tbody>  </table>每當我刷新頁面(返回相同的結果集)時,進程內存每次都會增加 20 到 30 MB。下面是內存診斷的屏幕截圖:快照 1 在第一頁加載之前;快照 2 是在第一頁加載之后;快照 3 是同一頁面數十次重新加載后的結果...我認為內存會保持不變,因為 DbContext 應該在每次請求時被釋放,不是嗎?我做錯了什么以及如何控制內存使用?
查看完整描述

2 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

我認為您對垃圾收集器的目的有一些誤解。其目的不是為了最小化內存使用;而是為了減少內存使用。相反,它是為了確保您的進程有可用的內存。這是一個重要的區別。

垃圾收集器將定期清理內存中不再使用的對象,并將它們標記為要收集。稍后,當 GC 檢測到內存不足時,它將激活并:

  1. 移動東西,這樣你就有更少的小內存塊和更多的大內存塊(內存只能在連續的塊中分配)。

  2. 收集對象并釋放它們的內存。

它將很少運行??梢詫ζ溥M行配置,以根據特定要求定制 GC,但很少需要這樣做。每次 GC 運行時,它都會盡可能少地執行操作以確保您的程序擁有所需的內存。這樣做是因為垃圾收集成本高昂,并且可能導致明顯的性能峰值。

處置一個對象并不意味著“立即擺脫它并釋放其內存”。意思是“我不再使用這個了,所以你可以在方便的時候清理它?!?nbsp;(軟件太有禮貌了!)因此,處理上下文不會立即減少內存使用量??梢韵?GC 發出非常強烈的提示,表明您想要收集,但很少需要且不建議這么做。

所以,你的 GC 會等待。它會等待時機,直到檢測到“嘿,我們內存不足!” 然后,也只有到那時,它才會檢查您的進程是否有無法收集的對象。

因此,當您的內存消耗開始超過進程可用的內存時,您可以預期 GC 將會運行。然后,它將盡快釋放內存。它的目標只是確保您的進程有可用的內存。

那么,您可以期待觀察到什么?

  1. 你的進程內存會像過山車一樣上下波動。它上漲的頻率會比下跌的頻率更高。

  2. 您的進程內存使用量將趨向于最大可用內存,并且通常只會在接近限制時才會下降。

  3. 集合不會頻繁發生(根據需要),并且大小可能相差很大。

我認為您無需擔心任何事情,并且建議您僅在開始出現內存不足錯誤時才擔心內存使用情況。


查看完整回答
反對 回復 2023-09-24
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

您實際上可以使用 MemoryDiagnoser 查看內存使用情況和 GC 收集的情況。我建議使用 GcMode Server 為 TRUE,因為它將更好地向您展示 GC 如何在服務器上而不是在本地工作站上工作。我知道學習如何使用它很麻煩,但經過一段時間后,這是非常值得的。

在 VS 中查看內存使用情況的問題是因為它處于調試模式,而這并不完全是您的代碼在發布時的行為方式。


查看完整回答
反對 回復 2023-09-24
  • 2 回答
  • 0 關注
  • 161 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號