成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析C#運(yùn)行時(shí)相互關(guān)系

開(kāi)發(fā) 后端
本文將介紹C#運(yùn)行時(shí)相互關(guān)系,包括運(yùn)行時(shí)類型、對(duì)象、線程棧和托管堆之間的相互關(guān)系,靜態(tài)方法、實(shí)例方法和虛方法的區(qū)別等等。

  本博客主要講述運(yùn)行時(shí)類型、對(duì)象、線程棧和托管堆之間的相互關(guān)系,靜態(tài)方法、實(shí)例方法和虛方法的區(qū)別,以及內(nèi)存的分配和回收。

  線程棧:在一個(gè)進(jìn)程中可能包含多個(gè)線程,一個(gè)線程在創(chuàng)建的時(shí)候,會(huì)分配到一個(gè)大小1MB大小的棧,棧用于存儲(chǔ)方法的實(shí)參、形參以及方法內(nèi)部的局部變量,棧是從高位內(nèi)存地址向地位地址構(gòu)建的,由于棧有先進(jìn)后出的特點(diǎn),所以先定義的變量后被回收。

  下面來(lái)看一個(gè)簡(jiǎn)單的例子,讓你更了解線程棧

  由于線程棧是從高位開(kāi)始分配內(nèi)存,先分配的我就畫(huà)在上面了,在調(diào)用F1();方法時(shí),分配內(nèi)存的順序是:name->n->F2的返回地址->Age->name;回收內(nèi)存的順序當(dāng)然是反過(guò)來(lái)的。在一個(gè)方法中,應(yīng)該包含一些序幕代碼,進(jìn)行一些初始化工作,還有一些尾聲代碼,等方法執(zhí)行完成之后做一些回收工作。由于方法的返回地址先分配,在方法執(zhí)行完成的時(shí)候回到返回地址,遞歸太深就容易出現(xiàn)棧溢出,請(qǐng)看我的《遞歸再一次讓哥震驚了》,因?yàn)閰?shù)、局部變量都必須等到方法返回的時(shí)候才能回收。

  在介紹托管堆之前先看看兩個(gè)簡(jiǎn)單的類:

 

  1.   publicclassPerson  
  2.   {  
  3.   privateintheight;  
  4.   publicvoidSetHeight(intheight)  
  5.   {  
  6.   this.height = height;  
  7.   }  
  8.   publicvirtualvoidSay(stringword) { }  
  9.   publicstaticstringHead()  
  10.   {  
  11.   return"my head";  
  12.   }  
  13.   publicstaticintAge = 100;  
  14.   }  
  15.   publicclassStudent : Person  
  16.   {  
  17.   publicoverridevoidSay(stringword)  
  18.   {  
  19.   Console.WriteLine(word);  
  20.   }  
  21.   } 

 

 

  1. staticvoidMain(string[] args)  
  2.   {  
  3.   Person student = newStudent();  
  4.   student.Say("Hello cth");  
  5.   student.SetHeight(172);  
  6.   Person.Head();  
  7.   Console.ReadLine();  
  8.   } 

 

  CLR會(huì)在第一次訪問(wèn)一個(gè)對(duì)象時(shí)加載該對(duì)象,在這里,定義變量student時(shí)會(huì)為Person對(duì)象在線程棧中分配內(nèi)存,第一次加載嗎,在構(gòu)造一個(gè)Student對(duì)象之前先要加載Student對(duì)象,并為Student類型對(duì)象分配內(nèi)存,并構(gòu)建一個(gè)Student對(duì)象。對(duì)象的地址存入線程棧中的局部變量student 中,我們知道類型對(duì)象的內(nèi)容包含:類型對(duì)象指針、同步索引塊、靜態(tài)字段和方法(靜態(tài)的和非靜態(tài)的),不管是類型對(duì)象、還是實(shí)例類型都必須有類型對(duì)象指針、同步索引塊;我們知道靜態(tài)字段屬于類,被這個(gè)類的所有實(shí)例共享,當(dāng)然靜態(tài)字段的內(nèi)存是在類型本身中分配的,方法也是類的所有實(shí)例共享的,他的內(nèi)存也是在類型本身中分配的,在每一個(gè)類型對(duì)象中都有一個(gè)方法表,類中定義的方法都有一個(gè)對(duì)應(yīng)的項(xiàng)。

  在構(gòu)造一個(gè)對(duì)象的實(shí)例時(shí),只需要為類型對(duì)象指針、同步索引塊、該對(duì)象的實(shí)例字段分配內(nèi)存,對(duì)于對(duì)象實(shí)例來(lái)說(shuō),類型對(duì)象指針可以讓實(shí)例訪問(wèn)類型對(duì)象中德靜態(tài)字段、方法等。

  Student是線程棧中的定義的一個(gè)局部變量,保存Student的一個(gè)實(shí)例的在托管堆中的地址,所以他可以訪問(wèn)Student對(duì)象中的字段,方法,其實(shí)訪問(wèn)方法是通過(guò)類型對(duì)象指針訪問(wèn)類型對(duì)象Student中的方法表中對(duì)象的項(xiàng)。

  Say方法的執(zhí)行過(guò)程:變量student指向的是一個(gè)Student對(duì)象,調(diào)用的當(dāng)然是Student類型對(duì)象中的Say方法,盡管在定義student的時(shí)候是Person類型,因?yàn)樗且妙愋停赶虻氖峭泄芏阎蠸tudent對(duì)象的內(nèi)存,然后遍歷該對(duì)象的方法表,找到該方法調(diào)用。

  特別說(shuō)明虛方法,JIT在虛方法中加了一些額外的代碼,方法每次調(diào)用的時(shí)候都會(huì)執(zhí)行這些代碼,這些代碼會(huì)檢查發(fā)出調(diào)用的變量,然后根據(jù)這個(gè)變量找到其應(yīng)用的對(duì)象,然后調(diào)用這個(gè)對(duì)象的方法,若沒(méi)有這些代碼,你覺(jué)得CLR是調(diào)用父類的方法還是調(diào)用之類的方法呢,虛方法帶來(lái)方便的同時(shí),也多了這些必須的檢查的代碼。

  SetHeight方法的執(zhí)行過(guò)程:和Say方法前面是一樣,只是在遍歷Student對(duì)象的方法表時(shí)沒(méi)有找到該方法,我們知道父類中定義的非private方法都可以被子類繼承,是因?yàn)槊總€(gè)類型都定義了一個(gè)字段引用了他的基類,如果一個(gè)類調(diào)用的方法那個(gè)方法不是自己定義的,那么編譯器會(huì)回溯類層次結(jié)構(gòu),一直到基類Object,找到相關(guān)的方法并調(diào)用,如果沒(méi)有找到相關(guān)的方法就報(bào)了異常唄。所以SetHeight方法其實(shí)調(diào)用的是Person中的SetHeight方法。

  Head方法的執(zhí)行:由于Head方法是靜態(tài)方法和上面兩個(gè)方法有所不同,調(diào)用靜態(tài)方法的時(shí)候,CLR會(huì)定位與靜態(tài)方法對(duì)象的類型對(duì)象,然后在對(duì)應(yīng)實(shí)例對(duì)象對(duì)象的方法表中查找相關(guān)的記錄項(xiàng),如果沒(méi)有找到,同樣會(huì)回溯。

  當(dāng)執(zhí)行完student.SetHeight(172);時(shí),student在也沒(méi)有被引用,成為垃圾,在其所在的方法返回之前將會(huì)被回收,也就是說(shuō)student實(shí)例對(duì)象被回收,釋放其所在的內(nèi)存,而類型對(duì)象不會(huì)被回收,類型對(duì)象的生成周期是:對(duì)象被加載到CLR中,直到其所在的AppDomain卸載。靜態(tài)字段是他所引用類型的跟,所以被靜態(tài)類型引用的對(duì)象永遠(yuǎn)不會(huì)被回收,如果其引用的是一個(gè)集合對(duì)象,并向其中不斷的加入元素的話,就會(huì)造成內(nèi)存泄露,更多關(guān)于內(nèi)存管理垃圾回收,請(qǐng)看我的另一篇博客《垃圾回收--代》

  作者:陳太漢

  博客:http://www.cnblogs.com/hlxs/

【編輯推薦】

  1. 詳解C#中不同類的類型
  2. 淺談C#中標(biāo)準(zhǔn)Dispose模式的實(shí)現(xiàn)
  3. C#選擇正確的集合進(jìn)行編碼
  4. C# 4.0新特性:協(xié)變與逆變中的編程思想
  5. C#應(yīng)用Attribute特性 代碼統(tǒng)計(jì)分析
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2023-01-03 09:10:21

2015-07-20 15:44:46

Swift框架MJExtension反射

2009-08-27 16:18:47

C#類C#結(jié)構(gòu)體

2024-03-21 09:15:58

JS運(yùn)行的JavaScrip

2009-02-10 09:03:59

動(dòng)態(tài)語(yǔ)言CLRVB.NET

2010-01-27 14:14:48

C++程序運(yùn)行時(shí)間

2011-08-19 15:05:29

異常處理

2010-06-17 19:07:12

UML對(duì)象

2010-01-18 11:05:24

C++

2009-09-01 16:35:16

C#單元測(cè)試

2019-07-12 09:30:12

DashboardDockerDNS

2021-09-11 15:38:23

容器運(yùn)行鏡像開(kāi)放

2010-04-26 10:32:55

Oracle 10g

2025-03-03 09:10:00

C++庫(kù)開(kāi)發(fā)

2009-08-17 18:34:50

C# ChangeCo

2009-08-14 17:45:52

C# ArrayLis

2009-08-07 17:25:37

C# SortedLi

2023-11-21 16:31:51

C++語(yǔ)言

2013-11-26 16:49:55

Android開(kāi)發(fā)運(yùn)行時(shí)KitKat

2021-08-18 08:32:09

代碼運(yùn)行時(shí)間示波器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久av在线播放 | 久久专区 | 久久高清 | 亚洲精品福利在线 | 国产蜜臀97一区二区三区 | 欧美性久久久 | 欧美一区永久视频免费观看 | 久久久久国产 | 欧美一区二区小视频 | 国产成人99久久亚洲综合精品 | 久久久国产一区二区三区 | 久久久日韩精品一区二区三区 | 成年无码av片在线 | 黄a免费看| 色综合久 | 亚洲1区| 久久国产区 | 免费成人午夜 | 成人免费视频网站在线观看 | 日韩成人在线网站 | 国产亚洲成av人片在线观看桃 | xxx.在线观看| 国产成人免费视频网站高清观看视频 | 亚洲欧美中文日韩在线v日本 | 性做久久久久久免费观看欧美 | 91影院 | 国内精品久久久久久影视8 最新黄色在线观看 | 午夜www | 日本一区高清 | 精品国产一区二区三区久久久蜜月 | 精品福利视频一区二区三区 | 国产美女精品视频 | 亚洲人成在线播放 | 亚洲一区电影 | 国产在线1 | 黄色操视频 | 中国一级毛片免费 | 男女深夜网站 | 日韩一区二区三区视频在线播放 | 国产精品久久久久久吹潮 | 精品一级毛片 |