詳解C# 代碼占用的空間
是不是代碼會占用空間,如果一個(gè)程序初始化需要 100M 的代碼,那么在他初始化之后,這些代碼就沒有作用了,他會不會占空間?本文經(jīng)過測試發(fā)現(xiàn),代碼也是會占空間。
我寫了2k個(gè)垃圾類代碼,然后把他放在一個(gè)項(xiàng)目 BhgpsWnb,使用另一個(gè)項(xiàng)目去引用他。是不是覺得軟件在運(yùn)行的時(shí)候就需要很多的內(nèi)存來放代碼?
引用垃圾程序的項(xiàng)目是 ReKlnma ,先只是在引用添加項(xiàng)目引用,然后在不使用 BhgpsWnb 這個(gè)項(xiàng)目的代碼,我運(yùn)行下面的代碼
static void Main(string[] args) { Console.ReadKey(); }
占用 7 M 內(nèi)存,而如果運(yùn)行了存在 2k 垃圾代碼 BhgpsWnb 程序,就需要 8M 。使用方法是創(chuàng)建一個(gè)類,這個(gè)類就是垃圾代碼里面的一個(gè),這樣就需要把dll放在內(nèi)存。
static void Main(string[] args) { var ablkekbuuimc = new Ablkekbuuimc(); ablkekbuuimc.Aaxfyerenjmfe(2); Console.ReadKey(); }
如果覺得因?yàn)閯?chuàng)建一個(gè)類需要的內(nèi)存太大,那么我使用下面的代碼,只是拿到一個(gè)類型,但是需要的內(nèi)存是 8M 因?yàn)槌绦驎蚜硪粋€(gè)程序加載
static void Main(string[] args) { Type t = typeof(Ablkekbuuimc); Console.ReadKey(); }
下面來換個(gè)方式寫,取消對垃圾程序的直接引用。使用 Load 方法去加載,可以看到垃圾程序 BhgpsWnb 有 8M ,一般的庫可沒有那么大。
static void Main(string[] args) { var file = new FileInfo("BhgpsWnb.exe"); Assembly.LoadFile(file.FullName); Console.ReadKey(); }
結(jié)果使用內(nèi)存需要 8M 多,所以代碼也是需要內(nèi)存的,一旦加載了就不會從程序集卸載。
如果是加載程序集,那么加載程序集就需要很多的內(nèi)存,即使卸載程序也沒有用
static void Main(string[] args) { var app = Load(); GC.Collect(); GC.WaitForFullGCComplete(); Console.ReadKey(); AppDomain.Unload(app); Console.ReadKey(); GC.Collect(); GC.WaitForFullGCComplete(); } private static AppDomain Load() { var file = new FileInfo("BhgpsWnb.exe"); var otherAssemblyBytes = File.ReadAllBytes(file.FullName); var app = AppDomain.CreateDomain("BhgpsWnb"); app.Load(otherAssemblyBytes); return app; }
上面的代碼使用了 Load 就需要 20M的內(nèi)存,在后面使用 Unload 之后實(shí)際上內(nèi)存也沒有減少,所以建議不要使用程序集加載方式,這個(gè)方式使用很多內(nèi)存。
可以通過指定名稱加載,可以看到下面的代碼需要使用內(nèi)存比較小,需要 9M ,但是 Unload 之后沒有減少內(nèi)存
static void Main(string[] args) { var app = Load(); GC.Collect(); GC.WaitForFullGCComplete(); Console.ReadKey(); AppDomain.Unload(app); GC.Collect(); GC.WaitForFullGCComplete(); Console.ReadKey(); } private static AppDomain Load() { var file = new FileInfo("BhgpsWnb.exe"); var app = AppDomain.CreateDomain("BhgpsWnb", null, file.DirectoryName, file.DirectoryName, false); app.Load("BhgpsWnb, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); return app; }
所以在加載 dll ,千萬不要使用把文件作為 byte 讀出來,然后加載,這個(gè)方法需要很多的內(nèi)存。
總結(jié)
以上所述是小編給大家介紹的C# 代碼占用的空間,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
C#使用FileStream循環(huán)讀取大文件數(shù)據(jù)的方法示例
這篇文章主要介紹了C#使用FileStream循環(huán)讀取大文件數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了FileStream文件流的形式循環(huán)讀取大文件的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05C#使用InstallerProjects打包桌面應(yīng)用程序的完整步驟
這篇文章主要給大家介紹了關(guān)于C#使用InstallerProjects打包桌面應(yīng)用程序的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07C# 設(shè)計(jì)模式系列教程-狀態(tài)模式
狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同的一系列類當(dāng)中,可以把復(fù)雜的邏輯判斷簡單化。2016-06-06Winform應(yīng)用程序如何使用自定義的鼠標(biāo)圖片
這篇文章主要介紹了Winform應(yīng)用程序如何使用自定義的鼠標(biāo)圖片,在window系統(tǒng)中,自帶的鼠標(biāo)外觀可能看起來比較小,因此我們需要使用自己的鼠標(biāo)圖片外觀2020-11-11C#實(shí)現(xiàn)流程圖設(shè)計(jì)器
這篇文章主要介紹了C#實(shí)現(xiàn)流程圖設(shè)計(jì)器,感興趣的小伙伴們可以參考一下2015-11-11C#實(shí)現(xiàn)實(shí)體類和XML的相互轉(zhuǎn)換
本文詳細(xì)講解了C#實(shí)現(xiàn)實(shí)體類和XML的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02