1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        .NET內(nèi)存管理五大基礎(chǔ)知識(shí)

        共 1694字,需瀏覽 4分鐘

         ·

        2021-10-22 11:12

        .NET內(nèi)存管理五大基礎(chǔ)知識(shí)

        1.小對(duì)象怎么處理的?

        小型.NET對(duì)象被分配到小型對(duì)象堆(SOH)上。其中有3種:第0代,第1代和第2代。對(duì)象根據(jù)其壽命向上移動(dòng)。

        將新對(duì)象放在Gen 0上。當(dāng)Gen 0充滿時(shí),.NET垃圾收集器(GC)運(yùn)行,處理不再需要的對(duì)象,并將其他所有內(nèi)容移至Gen1。如果Gen 1充滿,則GC再次運(yùn)行,也可以將Gen 1中的對(duì)象移動(dòng)到Gen 2中。

        當(dāng)Gen 2變滿時(shí),將發(fā)生GC完全運(yùn)行。這將清除不需要的Gen 2對(duì)象,將Gen 1對(duì)象移至Gen 2,然后將Gen 0對(duì)象移至Gen 1,最后清除所有未引用的內(nèi)容。每次運(yùn)行GC之后,都會(huì)壓縮受影響的堆,以將仍在使用的內(nèi)存保持在一起。

        這種代代相傳的方法可確保事情高效運(yùn)行-耗時(shí)的壓縮過(guò)程僅在絕對(duì)必要時(shí)才會(huì)發(fā)生。

        注意:如果您在Gen 2中看到大量的內(nèi)存,則表明內(nèi)存已被保留很長(zhǎng)時(shí)間,并且可能存在內(nèi)存問(wèn)題。這是內(nèi)存分析工具可以派上用場(chǎng)的地方。

        2.較大的對(duì)象會(huì)怎樣?

        大于85 KB的對(duì)象被分配到大對(duì)象堆(LOH)。由于復(fù)制大塊內(nèi)存的開(kāi)銷,它們沒(méi)有被壓縮。當(dāng)發(fā)生完整的GC時(shí),未使用的LOH對(duì)象的地址范圍將記錄在可用空間分配表中。

        分配新對(duì)象后,將在此可用空間表中檢查足以容納該對(duì)象的地址范圍。如果存在,則將對(duì)象分配到那里,如果不存在,則將對(duì)象分配到下一個(gè)可用空間。

        由于對(duì)象不太可能是空地址范圍的確切大小,因此對(duì)象之間幾乎總是會(huì)留有小塊內(nèi)存,從而導(dǎo)致碎片。如果這些塊小于85 KB,則根本沒(méi)有重用的可能性。因此,隨著分配需求的增加,即使碎片空間仍然可用,也會(huì)保留新的段。

        此外,當(dāng)需要分配大對(duì)象時(shí),.NET還是傾向于將對(duì)象附加到末尾,而不是運(yùn)行昂貴的Gen 2 GC。這對(duì)性能有好處,但是是導(dǎo)致內(nèi)存碎片的重要原因

        3.垃圾收集器可以在不同的模式下運(yùn)行以優(yōu)化性能

        .NET通過(guò)為GC提供多種模式來(lái)解決性能與堆效率之間的權(quán)衡問(wèn)題。

        工作站模式為用戶提供了最大的響應(yīng)速度,并減少了由于GC造成的暫停。它可以作為“并發(fā)”或“非并發(fā)”運(yùn)行,指的是運(yùn)行GC的線程。默認(rèn)值為并發(fā),它為GC使用單獨(dú)的線程,因此應(yīng)用程序可以在GC運(yùn)行時(shí)繼續(xù)執(zhí)行。

        服務(wù)器模式可為服務(wù)器環(huán)境提供最大的吞吐量,可伸縮性和性能。在服務(wù)器模式下,段大小和生成閾值通常比工作站模式大得多,這反映了對(duì)服務(wù)器的更高要求。

        服務(wù)器模式在多個(gè)線程上并行運(yùn)行垃圾回收,為每個(gè)邏輯處理器分配一個(gè)單獨(dú)的SOH和LOH,以防止線程相互干擾。

        .NET框架提供了一種交叉引用機(jī)制,因此對(duì)象仍然可以在堆之間相互引用。但是,由于應(yīng)用程序響應(yīng)能力不是服務(wù)器模式的直接目標(biāo),因此在GC期間,所有應(yīng)用程序線程都將被掛起。

        4.引用不足會(huì)在性能和內(nèi)存效率之間折衷

        弱對(duì)象引用了GC根的替代來(lái)源,使您可以保留對(duì)象,同時(shí)在GC需要時(shí)可以收集對(duì)象。它們是代碼性能和內(nèi)存效率之間的折衷。創(chuàng)建對(duì)象需要占用CPU時(shí)間,但保持加載狀態(tài)需要占用內(nèi)存。

        弱引用特別適用于大型數(shù)據(jù)結(jié)構(gòu)。例如,假設(shè)您有一個(gè)允許用戶瀏覽大型數(shù)據(jù)結(jié)構(gòu)的應(yīng)用程序,他們可能會(huì)返回其中的一些數(shù)據(jù)。您可以將任何強(qiáng)引用轉(zhuǎn)換為他們?yōu)g覽的結(jié)構(gòu)為弱引用。如果用戶返回到這些結(jié)構(gòu),則可以使用它們,但如果沒(méi)有,GC可以根據(jù)需要回收內(nèi)存。

        5.對(duì)象固定可以創(chuàng)建在托管和非托管代碼之間傳遞的引用

        .NET使用一種稱為GCHandle的結(jié)構(gòu)來(lái)跟蹤堆對(duì)象。GCHandle可用于在托管域和非托管域之間傳遞對(duì)象引用,.NET維護(hù)一個(gè)GCHandles表以實(shí)現(xiàn)此目的。GCHandle有四種類型,包括固定的,用于將對(duì)象固定在內(nèi)存中的特定地址。

        對(duì)象固定的主要問(wèn)題是它可能導(dǎo)致SOH碎片化。如果將對(duì)象固定在GC期間,則根據(jù)定義,該對(duì)象無(wú)法重定位。根據(jù)您使用固定的方式,它會(huì)降低壓縮的效率,在堆中留下間隙。避免這種情況的最佳策略是在很短的時(shí)間內(nèi)鎖定,然后釋放。


        瀏覽 44
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            在线视频 日韩 | 成人国产精品秘 久久久 | 大尺度做爰戏 | 99久久久国产精品免费四虎 | 久久婷婷国产麻豆91天堂 | 色综合狠狠爱 | 国产天堂| 鸡巴视频在线观看 | 天堂乱伦 | 黄色操逼大片 |