程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 淺談CLR的內存分配和回收機制(2)

淺談CLR的內存分配和回收機制(2)

編輯:關於C語言

* 析構函數會在編譯時會被翻譯為protected void Finalize(),這是C#的析構函數的 語法

GC在回收對象之前會調用Finalize()來實現非托管資源的釋放,不過按照MSDN的說法 ,Finalize()會導致性能的降低。

“垃圾回收器使用名為“終止隊列”的內部結構跟蹤具有 Finalize 方法的對象。每次您的應用程序創建具有 Finalize 方法的對象時,垃圾回收器都在終止 隊列中放置一個指向該對象的項。托管堆中所有需要在垃圾回收器回收其內存之前調用它 們的終止代碼的對象都在終止隊列中含有項。

實現 Finalize 方法或析構函數對性能可能會有負面影響,因此應避免不必要地使用 它們。用 Finalize 方法回收對象使用的內存需要至少兩次垃圾回收。當垃圾回收器執行 回收時,它只回收沒有終結器的不可訪問對象的內存。這時,它不能回收具有終結器的不 可訪問對象。它改為將這些對象的項從終止隊列中移除並將它們放置在標為准備終止的對 象列表中。該列表中的項指向托管堆中准備被調用其終止代碼的對象。垃圾回收器為此列 表中的對象調用 Finalize 方法,然後,將這些項從列表中移除。後來的垃圾回收將確定 終止的對象確實是垃圾,因為標為准備終止對象的列表中的項不再指向它們。在後來的垃 圾回收中,實際上回收了對象的內存。” --[MSDN]

更加建議實現Sytem.IDisposable.Dispose()接口,用來實現對非托管資源的釋放,這 也是.Net Framework中常見的設計模式。那該怎麼實現Dispose呢?

1、首先,Dispose接口應該釋放自身對象所占用的資源,還應該調用基類的Dispose方 法,釋放基類部分所占用的資源。

public void Dispose()
{
  // do something to release my unmanaged resource
  ReleaseMyResource();
  base.Dispose();
}

2、前面說過Finalize()會導致性能問題,那麼在執行Dispose以後就應該告訴GC不用 在調用Finalize()了

public void Dispose()
{
  // do something to release my unmanaged resource
  ReleaseMyResource();
  base.Dispose();
  // tell gc not to call Finalize()
  GC.SuppressFinalize(this);
}

當然我們完全可以定義一個MySpace.IClosable.Close(),通過實現這個接口來進行非 托管資源的釋放,不過這實在沒有必要。

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