日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[你必须知道的.NET]第十八回:对象创建始末(上)

發布時間:2023/12/10 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [你必须知道的.NET]第十八回:对象创建始末(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文將介紹以下內容:

  • 對象的創建過程
  • 內存分配分析
  • 內存布局研究

???

1.?引言

了解.NET的內存管理機制,首先應該從內存分配開始,也就是對象的創建環節。對象的創建,是個復雜的過程,主要包括內存分配和初始化兩個環節。例如,對象的創建過程可以表示為:

????????????FileStream?fs =?new?FileStream(@"C:"temp.txt",?FileMode.Create);

通過new關鍵字操作,即完成了對FileStream類型對象的創建過程,這一看似簡單的操作背后,卻經歷著相當復雜的過程和周折。

本篇全文,正是對這一操作背后過程的詳細討論,從中了解.NET的內存分配是如何實現的?

2.?內存分配

關于內存的分配,首先應該了解分配在哪里的問題。CLR管理內存的區域,主要有三塊,分別為:

·???????線程的堆棧,用于分配值類型實例。堆棧主要由操作系統管理,而不受垃圾收集器的控制,當值類型實例所在方法結束時,其存儲單位自動釋放。棧的執行效率高,但存儲容量有限。

·???????GC堆,用于分配小對象實例。如果引用類型對象的實例大小小于85000字節,實例將被分配在GC堆上,當有內存分配或者回收時,垃圾收集器可能會對GC堆進行壓縮,詳情見后文講述。

·???????LOH(Large Object Heap)堆,用于分配大對象實例。如果引用類型對象的實例大小不小于85000字節時,該實例將被分配到LOH堆上,而LOH堆不會被壓縮,而且只在完全GC回收時被回收。

本文討論的重點是.NET的內存分配機制,因此下文將不加說明的以GC堆上的分配為例來展開。關于值類型和引用類型的論述,請參見[第八回:品味類型---值類型與引用類型(上)-內存有理]。

了解了內存分配的區域,接著我們看看有哪些操作將導致對象創建和內存分配的發生,關于實例創建有多個IL指令解析,主要包括:

·???????newobj,用于創建引用類型對象。

·???????ldstr,用于創建string類型對象。

·???????newarr,用于分配新的數組對象。

·???????box,在值類型轉換為引用類型對象時,將值類型字段拷貝到托管堆上發生的內存分配。

????在上述論述的基礎上,下面從堆棧的內存分配和托管堆的內存分配兩個方面來分別論述.NET的內存分配機制。

2.1?堆棧的內存分配機制

對于值類型來說,一般創建在線程的堆棧上。但并非所有的值類型都創建在線程的堆棧上,例如作為類的字段時,值類型作為實例成員的一部分也被創建在托管堆上;裝箱發生時,值類型字段也會拷貝在托管堆上。

對于分配在堆棧上的局部變量來說,操作系統維護著一個堆棧指針來指向下一個自由空間的地址,并且堆棧的內存地址是由高位到低位向下填充。以下例而言:

????????public?static?void?Main()
????????{
????????????int?x?=?100;
????????????char?c?=?'A';
????????}

???假設線程棧的初始化地址為50000,因此堆棧指針首先指向50000地址空間。代碼由入口函數Main開始執行,首先進入作用域的是整型局部變量x,它將在棧上分配4Byte的內存空間,因此堆棧指針向下移動4個字節,則值100將保存在49997~50000單位,而堆棧指針表示的下一個自由空間地址為49996,如圖所示:

接著進入下一行代碼,將為字符型變量c分配2Byte的內存空間,堆棧指針向下移動2個字節至49994單位,值’A’會保存在49995~49996單位,地址的分配如圖:

最后,執行到Main方法的右括號,方法體執行結束,變量x和c的作用域也隨之結束,需要刪除變量x和c在堆棧內存中的值,其釋放過程和分配過程剛好相反:首先刪除c的內存,堆棧指針向上遞增2個字節,然后刪除x的內存,堆棧指針繼續向上遞增4個字節,程序執行結束,此時的內存狀況為:

??? 其他較復雜的分配過程,可能在作用域和分配大小上有所不同,但是基本過程大同小異。棧上的內存分配,效率較高,但是內存容量不大,同時變量的生存周期隨著方法的結束而消亡。

總結

以上是生活随笔為你收集整理的[你必须知道的.NET]第十八回:对象创建始末(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。