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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

引用“.NET研究”类型赋值为null与加速垃圾回收

發布時間:2025/5/22 asp.net 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 引用“.NET研究”类型赋值为null与加速垃圾回收 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  在標準的Dispose模式中,提到了需要及時釋放資源,卻并沒有進一步細說讓引用等于null是否有必要。

  有一些人認為等于null可以幫助垃圾回收機制早點發現并標識對象是垃圾。其他人則認為這沒有任何幫助。是否賦值為null的問題首先在方法的內部被人提起?,F在,為了更好的闡述提出的問題,我們來撰寫一個Winform窗體應用程序。如下:

private void button1_Click(object sender, EventArgs e)
{
Method1();
Method2();
上海企業網站制作 }

private void button2_Click(object sender, EventArgs e)
{
GC.Collect();
}

private void Method1()
{
SimpleClass s
= new SimpleClass("method1");
s
= null;
//其它無關工作代碼(這條注釋源于回應回復的朋友的質疑)
}
private void Method2()
{
SimpleClass s
= new SimpleClass("method2");
}
}

class SimpleClass
{
stringm_text;

public SimpleClass(string text)
{
上海徐匯企業網站設計與制作 m_text
= text;
}

~上海網站建設an>SimpleClass()
{
MessageBox.Show(
string.Format("SimpleClass Disposed, tag:{0}", m_text));
}
}

  先點擊按鈕1,再點擊按鈕2釋放,我們會發現:

  q?方法Method2中的對象先被釋放,雖然它在Method1之后被調用;

  q?方法Method2中的對象先被釋放,雖然它不像Method1那樣為對象引用賦值為null;

  在CLR托管應用程序中,存在一個根的概念,類型的靜態字段、方法參數以及局部變量都可以作為根存在(值類型不能作為根,只有引用類型的指針才能作為根)。

  上面的兩個方法中各自的局部變量,在代碼運行過程中會在內存中各自創建一個根.在一次垃圾回收中,垃圾回收器會沿著線程棧上行檢查根。檢查到方法內的根時,如果發現沒有任何一個地方引用了局部變量,則不管是否為變量賦值為null,都意味著該根已經被停止掉。然后垃圾回收器發現該根的引用為空,同時標記該根可被釋放,這也表示著Simple類型對象所占用的內存空間可被釋放。所以,在上面的這個例子中,為s指定為null絲毫沒有意義(方法的參數變量也是這種情況)。

  更進一步的事實是,JIT編譯器是一個經過優化的編譯器,無論我們是否在方法內部為局部變量賦值為null,該語句都會被忽略掉

s = null;

  在我們將項目設置為Release模式下,上面的這行代碼將根本不會被編譯進運行時內。

  正式由于上面這樣的分析,很多人認為為對象賦值為null完全沒有必要。但是,在另外一種情況下,卻要注意及時為變量賦值為null。那就是類型的靜態字段。為類型對象賦值為null,并不意味著同時為類型的靜態字段賦值為null:

private void button1_Click(object sender, EventArgs e)
{
SimpleClass s
上海企業網站設計與制作"color: #000000;">= new SimpleClass("test");
}

private void button2_Click(object sender, EventArgs e)
{
GC.Collect();
}
}

class SimpleClass
{
static AnotherSimpleClass asc = new AnotherSimpleClass();
string m_text;

public SimpleClass(string text)
{
m_text
= text;
}

~SimpleClass()
{
//asc = null;
MessageBox.Show(string.Format("SimpleClass Disposed, tag:{0}", m_text));
}
}

class AnotherSimpleClass
{
~AnotherSimpleClass()
{
MessageBox.Show(
"AnotherSimpleClass Disposed");
}
}

  以上代碼運行的結果使我們發現,當執行垃圾回收,當類型SampleClass對象被回收的時候,類型的靜態字段asc并沒有被回收。

  必須要將SimpleClass的終結器中注釋的那條代碼啟用。

  字段asc才能被正確釋放(注意,要點擊兩次釋放按鈕。這是因為一次垃圾回收會僅僅首先執行終結器)。之所以靜態字段不被釋放(同時賦值為null語句也不會像局部變量那樣被運行時編譯器優上海閔行企業網站設計與制作化掉),是因為類型的靜態字段一旦被創建,該根就一直存在。所以垃圾回收器始終不會認為它是一個垃圾。非靜態字段不存在這個問題。將asc改為非靜態,再次運行上面的代碼,會發現asc隨著類型的釋放而被釋放。

  上文代碼的例子中,讓asc=null是在終結器中完成的,實際工作中,一旦我們感覺到自己的靜態引用類型參數占用內存空間比較大,并且使用完畢后不再使用,則可以立刻將其賦值為null。這也許并不必要,但這絕對是一個好習慣。試想一下在一個大系統中,那些時不時在類型中出現的靜態變量吧,它們就那樣靜靜地呆在內存里,一旦被創建,就永遠不離開,越來越多,越來越多。

總結

以上是生活随笔為你收集整理的引用“.NET研究”类型赋值为null与加速垃圾回收的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲第一黄色 | 国产男同gay网站 | 一级黄色在线视频 | 催眠调教艳妇成肉便小说 | 五个女闺蜜把我玩到尿失禁 | 亚洲综合影院 | 午夜精品99 | 中文天堂av | 韩国日本美国免费毛片 | 天堂在线日本 | 欧美日韩xxx | 中文字幕免费高清在线 | 国产精品熟女一区二区不卡 | 亚洲欧美日韩国产一区二区三区 | 日韩亚洲精品视频 | 亚洲国产精品视频在线 | 午夜伦理av | 中文字幕777 | 亚洲国产精品久久久久久 | 欧美成人午夜免费视在线看片 | 久久影库 | 欧美a级在线观看 | 国产一区视频免费观看 | 亚洲精品在线观看视频 | 啪啪免费av| 国产一区 在线播放 | 久久久久久国产精品视频 | 日日操网站 | 五月天黄色网 | 就爱操av| 中文字幕1页 | 91久久国产综合久久 | 欧美性猛交xx | 青草视频在线观看免费 | 草草地址线路①屁屁影院成人 | 骚虎视频在线观看 | 好吊妞视频这里只有精品 | 亚洲国产精品国自产拍av | 免费一二区| 激情亚洲| 少妇毛片 | 国产乱妇无码大片在线观看 | 小嫩嫩12欧美 | 亚洲熟乱| 免费看污片网站 | 日韩欧美视频二区 | 日本美女高潮 | 国产午夜精品一区二区三区视频 | 九九热国产在线 | 在线观看亚洲一区二区 | 爱爱综合 | 国产真实偷伦视频 | 日韩在线观看你懂的 | 免费毛片一区二区三区 | 免费看女生裸体视频 | 亚洲爽爆 | 日韩一区二区久久 | 91在线一区 | 国产二区精品视频 | 午夜三级在线观看 | 91精品一区二区三区在线观看 | 亚洲老女人视频 | 亚洲无卡 | a毛片 | 亚洲三级大片 | 少妇搡bbbb搡bbb搡小说 | 免费福利影院 | 久久精品人妻一区二区 | 亚洲AV无码一区二区三区蜜桃 | 国产精品suv一区二区88 | 国产精品免费一区二区三区在线观看 | 99视频在线精品免费观看2 | 日本不卡一二三区 | 精品无码久久久久国产 | 色网站在线播放 | 男男一级淫片免费播放 | 国产宾馆实践打屁股91 | 90岁老太婆乱淫 | 午夜精 | 淫五月| 极品美女一区二区三区 | 精品美女一区二区三区 | 一级特黄aaaaaa大片 | 亚洲精品成人无码 | 日本999视频 | 国产夫妻自拍小视频 | 天天操天天舔天天干 | 干一夜综合 | 禁漫天堂免费网站 | 人妻互换一二三区激情视频 | 亚洲精品一区二区三区中文字幕 | 五月天超碰 | www.蜜桃av.com | 女生脱裤子让男生捅 | 国产精品久久亚洲 | 日韩av网页| 极度诱惑香港电影完整 | 亚洲日本欧美 | 久青草视频在线 |