电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

ASP.NET堆和棧四之對托管和非托管資源的垃圾回收和內(nèi)存分配

瀏覽:173日期:2022-06-08 14:46:42

".NET的堆和棧"系列:

在" ASP.NET堆和棧一之基本概念和值類型內(nèi)存分配"中,了解了"堆"和"棧"的基本概念,以及值類型的內(nèi)存分配。我們知道:當執(zhí)行一個方法的時候,值類型實例會在"棧"上分配內(nèi)存,而引用類型實例會在"堆"上分配內(nèi)存,當方法執(zhí)行完畢,"棧"上的實例由操作系統(tǒng)自動釋放,"堆"上的實例由.NET Framework的GC進行回收。

在" ASP.NET堆和棧二之值類型和引用類型參數(shù)傳遞和內(nèi)存分配"中,我們了解了值類型參數(shù)和引用類型參數(shù)在傳遞時的內(nèi)存分配情況。

在" ASP.NET堆和棧三之引用類型對象拷貝和內(nèi)存分配"中,我們了解了在拷貝引用類型對象時的內(nèi)存分配情況。

而本篇的重點要放在:對托管和非托管資源的垃圾回收、處理以及內(nèi)存分配情況。

什么樣的對象被GC認為是垃圾?

當托管堆中的對象不被任何其它對象所引用,這些對象將成為被釋放的垃圾對象等待被GC回收。

每個應用程序都有一組根指針,這些根指針是不會被回收的,是由JIT編譯器和CLR運行時維護的一個列表。主要包括:

  • 全局/靜態(tài)指針:指向全局或局部靜態(tài)變量
  • 棧指針:指向應用程序線程所需要的那部分棧上空間
  • 寄存器指針:指向托管堆所需要的那部分CPU中的內(nèi)存地址

以上,假設(shè)托管堆中有5個對象,1和5被跟指針引用,3依賴1,那么在這組托管堆對象中,2和4被回收后變成如下:

當運行時有新的引用對象產(chǎn)生,將會被放到托管堆中這組對象的最上面。

GC如何回收?

GC對托管堆中對象的回收

GC采用一定的算法在托管堆中遍歷所有對象,最終形成一個可達對象和不可達對象,不可達對象將被回收。

GC對非托管堆中對象的回收、處理

對資源的回收

比如文件、數(shù)據(jù)庫鏈接、網(wǎng)絡(luò)鏈接等,這些不再托管堆中的對象如何被回收呢?

1、通過析構(gòu)函數(shù)回收
public class Sample{    //析構(gòu)函數(shù)    ~Sample()    {    }}

在托管堆中,那些帶有析構(gòu)函數(shù)的實例,將被放置到"Finalization Queue"中。

對于那些不被任何其它對象所引用,如果沒有析構(gòu)函數(shù),比如2,將被直接回收,如果有析構(gòu)函數(shù),例如4,會被放到"Freachable Queue"中,等待GC實施下一輪回收。

當為一個類添加析構(gòu)函數(shù)后,為GC增加了額外的工作,代價是比較昂貴的,更現(xiàn)實的做法是讓類來實現(xiàn)IDisposable接口。

2、通過實現(xiàn)IDisposable接口回收

首先讓一個類實現(xiàn)IDisposable接口。

public class ResourceClass : IDisposable{    public void Dispose()    {//TODO:實現(xiàn)回收邏輯    }}

在應用程序中調(diào)用如下實施回收。

using(ResourceClass re = new ResourceClass()){    }

對靜態(tài)值類型變量的處理

class Counter{    private static int s_Number = 0;         public static int GetNextNumber()    {int newNumber = s_Number;// DO SOME STUFFnewNumber += 1;s_Number = newNumber;return newNumber;    }}

如上,當方法有方法處理靜態(tài)字段就需要注意了,2個線程同時調(diào)用GetNextNumber()會得到相同的結(jié)果,而我們的本意是:每調(diào)用一次方法,靜態(tài)字段s_Number自增1。

我們可以在處理邏輯塊中加鎖,每次只允許一個線程執(zhí)行。

class Counter{    private static int s_Number = 0;         public static int GetNextNumber()    {lock (typeof(Counter)){    int newNumber = s_Number;        // DO SOME STUFF        newNumber += 1;    s_Number = newNumber;    return newNumber;}    }}

對靜態(tài)引用類型變量的處理

class Olympics{    public static Collection<Runner> TryoutRunners;} class Runner{    private string _fileName;    private FileStream _fStream;     public void GetStats()    {FileInfo fInfo = new FileInfo(_fileName);_fStream = _fileName.OpenRead();    }}

以上,在GetStats()方法中,由于沒有對FileStream及時關(guān)閉,如果Olympics恰巧有10萬個Runner的集合,10萬Runner都執(zhí)行沒有關(guān)閉FileStream的Gettats()方法,這將是一場災難!

Singleton模式可以很好地避免上述問題,它保證了在任何時候,內(nèi)存中只存在某個類的一個實例。

public class Earth{    private static Earth _instance = new Earth();    private Earth(){}    public static Earth GetInstance(){return _instance;}}

以上,單例模式的必要構(gòu)成要素包括:
1、私有靜態(tài)引用類型變量
2、私有構(gòu)造函數(shù)
3、獲取類實例的靜態(tài)方法

GC何時回收?

GC會周期性地執(zhí)行垃圾回收、內(nèi)存清理工作,以下情況會啟動GC:

  • 托管堆內(nèi)存不足溢出時
  • 調(diào)用GC.Collect()方法強制執(zhí)行垃圾回收
  • Windows報告內(nèi)存不足
  • CLR卸載AppDomain

GC回收之后,又執(zhí)行哪些操作?

GC在垃圾回收之后,托管堆上將出現(xiàn)多個被收集對象的"空洞",為了避免托管堆的內(nèi)存碎片,會重新分配內(nèi)存、壓縮托管堆。

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

標簽: ASP.NET
相關(guān)文章:
主站蜘蛛池模板: 工业铝型材-铝合金电机壳-铝排-气动执行器-山东永恒能源集团有限公司 | 无线讲解器-导游讲解器-自助讲解器-分区讲解系统 品牌生产厂家[鹰米讲解-合肥市徽马信息科技有限公司] | 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 济南宣传册设计-画册设计_济南莫都品牌设计公司 | 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 建筑工程资质合作-工程资质加盟分公司-建筑资质加盟 | 百方网-百方电气网,电工电气行业专业的B2B电子商务平台 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 免费B2B信息推广发布平台 - 推发网| 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 空心明胶胶囊|植物胶囊|清真胶囊|浙江绿键胶囊有限公司欢迎您! | 上海佳武自动化科技有限公司| 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 硅胶制品-硅橡胶制品-东莞硅胶制品厂家-广东帝博科技有限公司 | _网名词典_网名大全_qq网名_情侣网名_个性网名 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 保定市泰宏机械制造厂-河北铸件厂-铸造厂-铸件加工-河北大件加工 | 迪威娱乐|迪威娱乐客服|18183620002 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 联系我们-腾龙公司上分客服微信19116098882| 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 分子蒸馏设备(短程分子蒸馏装置)_上海达丰仪器 | 不干胶标签,不干胶标签纸_厂家-山东同力胶粘制品| 包装机_厂家_价格-山东包装机有限公司 | 办公室装修_上海办公室设计装修_时尚办公新主张-后街印象 | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 10吨无线拉力计-2吨拉力计价格-上海佳宜电子科技有限公司 | 四川成都干燥设备_回转筒干燥机_脉冲除尘器_输送设备_热风炉_成都川工星科机电设备有限公司 | 南京和瑞包装有限公司 | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 二手色谱仪器,十万分之一分析天平,蒸发光检测器,电位滴定仪-湖北捷岛科学仪器有限公司 | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 |