国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#內存管理優化暢想(一)----大對象堆(LOH)的壓縮

2019-11-14 15:47:00
字體:
來源:轉載
供稿:網友

    我們都知道,.net的GC是不會壓縮大對象堆的,因為其時間開銷不可接受,但這是以大對象堆產生大塊碎片為代價的,如果以后要分配的大對象比最大的碎片還大,那么即使它比所有碎片的總大小要小,也是無法在不擴展大對象堆的前提下分配成功的,此時有可能引發內存不足的異常。

    我想到一個方案,可以讓大對象堆也能壓縮,而且時間開銷在可接受的范圍內,原理是利用頁表。我們知道,程序能看到的內存地址都是虛擬地址,是通過頁表映射到物理地址的,連續的虛擬地址對應的物理地址未必連續,反之亦然。在內存中移動大量數據,開銷很大,因為數據真的要在物理內存上復制,但如果我們不動物理內存上的數據,只修改頁表及其緩存TLB,即修改了物理地址與虛擬地址的映射關系,開銷就會小得多,而且對于應用程序來說,同樣達到了內存移動的效果。(物理內存上沒有數據移動,但對象的虛擬地址卻變了,對應用程序來說,這就是數據移動了!)

    當然,如果要用這種方法實現壓縮大對象堆,也會有一些局限性:比如每個大對象必須占據整數頁的空間,且大對象的起始地址必須是某頁的起始地址,這樣大對象之間會出現一些小碎片(不會超過一頁的大小,即不超過4K,與85K以上的大對象本身相比,還是很小的),但小碎片總比大碎片好呀,就看怎么權衡了,而且這些小碎片也是可以被利用的,比如可以把一些大小合適的2代小對象存儲到這些小碎片中,以節約小對象堆的空間。

    PS: 現在的一些虛擬機軟件的實現似乎就使用了類似的方法,以達到提高效率的目的。 

    該問題的英文討論貼:https://github.com/dotnet/coreclr/issues/555


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 哈巴河县| 东港市| 莱州市| 壤塘县| 贵港市| 城口县| 开化县| 班玛县| 宁武县| 禹城市| 昭平县| 丹阳市| 从江县| 天镇县| 错那县| 康平县| 仁化县| 平塘县| 全州县| 桃江县| 南皮县| 吴旗县| 盐城市| 尼玛县| 永春县| 阿图什市| 扬州市| 吉安市| 大英县| 明星| 凉山| 报价| 福贡县| 延安市| 镇远县| 奎屯市| 扶余县| 修武县| 九寨沟县| 普安县| 耒阳市|