程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#第二章:.Net資源管理(1)

Effective C#第二章:.Net資源管理(1)

編輯:關於C語言

一個簡單的事實:.Net應用程序是在一個托管的環境裡運行的,這個環境和 不同的設計器有很大的沖突,這就才有了Effective C#。極大限度上的討論這個 環境的好處,須要把你對本地化環境的想法改變為.Net CLR。也就意味著要明白 .Net的垃圾回收器。在你明白這一章裡所推薦的內容時,有必要對.Net的內存管 理環境有個大概的了解。那我們就開始大概的了解一下吧。

垃圾回收器 (GC)為你控制托管內存。不像本地運行環境,你不用負責對內存洩漏,不定指針 ,未初始化指針,或者一個其它內存管理的服務問題。但垃圾回收器前不是一個 神話:你一樣要自己清理。你要對非托管資源負責,例如文件句柄,數據鏈接, GDI+對象,COM對象,以及其它一些系統對象。

這有一個好消息:因為GC 管理內存,明確的設計風格可以更容易的實現。循環引用,不管是簡單關系還是 復雜的網頁對象,都非常容易。GC的標記以及嚴謹的高效算法可以檢測到這些關 系,並且完全的刪除不可達的網頁對象。GC是通過對從應用程序的根對象開始, 通過樹形結構的“漫游”來斷定一個對象是否可達的,而不是強迫每 個對象都保持一些引用跟蹤,COM就是這樣的。DataSet就是一個很好的例子,展 示了這樣的算法是如何簡化並決定對象的所屬關系的。DataSet是一個DataTable 的集合,而每一個DataTable又是DataRow的集合,每一個DataRow又是DataItem 的集合,DataColum定義了這些類型的關系。這裡就有一些從DataItem到它的列 的引用。而同時,DataTime也同樣有一個引用到它的容器上,也就是DataRow。 DataRow包含引用到DataTable,最後每個對象都包含一個引用到DataSet。

(譯注:作者這裡是想說:你看,這麼復雜的引用關系,GC都可以輕松的 搞定,你看GC是不是很強大?)

如果這還不夠復雜,那可以創建一個 DataView,它提供對經過過濾後的數據表的順序訪問。這些都是由 DataVIEwManager管理的。所有這些貫穿網頁的引用構成了DataSet。釋放內存是 GC的責任。因為.Net框架的設計者讓你不必釋放這些對象,這些復雜的網頁對象 引用不會造成問題。沒有必須關心這些網頁對象的合適的釋放順序,這是GC的工 作。GC的設計結構可以簡化這些問題,它可以識別這些網頁對象就是垃圾。在應 用程序結束了對DataSet的引用後,沒有人可以引用到它的子對象了(譯注:就是 DataSet裡的對象再也引用不到了)。因此,網頁裡還有沒有對象循環引用 DataSet,DataTables已經一點也不重要了,因為這些對象在應用程序都已經不 能被訪問到了,它們是垃圾了。

垃圾回收器在它獨立的線程上運行,用 來從你的程序裡移除不使用的內存。而且在每次運行時,它還會壓縮托管堆。壓 縮堆就是把托管堆中活動的對象移到一起,這樣就可以空出連續的內存。圖2.1 展示了兩個沒有進行垃圾回收時的內存快照。所有的空閒內存會在垃圾回收進行 後連續起來。

圖2.1 垃圾回收器不僅僅是移動不使用的內存,還移除動其它的對象 ,從而壓縮使用的內存,讓出最多的空閒內存。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved