程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 全局靜態集合類型的變量的垃圾你給我去死!!!!(本文知識有誤,請等待8.12晚上的反思)

全局靜態集合類型的變量的垃圾你給我去死!!!!(本文知識有誤,請等待8.12晚上的反思)

編輯:C#入門知識

非靜態變量 靜態變量

 

 

然後  ,非靜態變量的那段代碼在哈希表被清掉之後,我截圖看是這樣滴。

 

 

 

而,靜態變量的哈希表被情調後,內存檢測工具顯示是這樣滴。

 

 

所以,我就信任了這個 內存檢測工具.....  唉.......。

 

 

而我用資源管理器裡的東西看內存,發現,兩個代碼都是由600多M(填充1000W個實體類) 掉到300多M(全部清空)。

 

而我在代碼中的類型A裡添加析構函數檢測,發現兩個代碼在清空的時候,1000W個類A都被銷毀了

 

所以我的教訓是

1:在沒有使用到一些特殊的諸如UI,IO,數據庫,圖片,事件=....  等地方的時候,幾乎可以完全相信.NET的GC的威力。只要你沒有某些代碼沒有死守著對象不放,GC是一定可以找到垃圾並回收的。靜態變量當然在此列

 

2:一些個工具什麼的其實未必要那麼信任。自己寫的代碼檢測才是王道

 

3:有問題就要拿出來大家一起討論,不怕丟臉,但就怕沒收獲

 

 

 

 

 

 

Main( ( i = ; i < ; i++ Dictionary<, A> dcA = Dictionary<, A> str =

 


 

 

 

 

 

 

 

 


 

 

List<A>();  
我們給這個aList填充1千萬個對象然後清空,內存會馬上會被回收。
但如果是public static List<A> aList =new List<A>();  
我們給這個靜態的aList填充1千萬個對象然後清空,內存就絲毫不會變。
而在我的業務需求中,我要求在內存中在我需要的時候一直駐留著List<A>,當其中的某個A的實例不要了我清掉,
這個被我清掉的的A的實例會被回收掉。
public static List<A> aList =new List<A>();  
 aList=null,這樣的機制
所以,我想了一個折中的辦法,即加入這個aList屬於  B類型,那麼我再創建一個C類型,在C類型中寫一個單鍵
類,有且僅有一個B的靜態實例。這樣的話我就能實現我的業務需求了
29樓的大俠給出了我的這種思想的代碼,各位前往圍觀啊

 


 

 

 29樓的大俠給出了我的問題的答案。各位可以參考一下 這篇博客 http://www.cnblogs.com/bayonetxxx/archive/2009/06/02/1494728.html。即WeakReference 類的使用。嘿嘿

 

 

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