詳解C# 代碼占用的空間
是不是代碼會占用空間,如果一個程序初始化需要 100M 的代碼,那么在他初始化之后,這些代碼就沒有作用了,他會不會占空間?本文經(jīng)過測試發(fā)現(xiàn),代碼也是會占空間。
我寫了2k個垃圾類代碼,然后把他放在一個項目 BhgpsWnb,使用另一個項目去引用他。是不是覺得軟件在運行的時候就需要很多的內(nèi)存來放代碼?
引用垃圾程序的項目是 ReKlnma ,先只是在引用添加項目引用,然后在不使用 BhgpsWnb 這個項目的代碼,我運行下面的代碼
static void Main(string[] args) { Console.ReadKey(); }
占用 7 M 內(nèi)存,而如果運行了存在 2k 垃圾代碼 BhgpsWnb 程序,就需要 8M 。使用方法是創(chuàng)建一個類,這個類就是垃圾代碼里面的一個,這樣就需要把dll放在內(nèi)存。
static void Main(string[] args) { var ablkekbuuimc = new Ablkekbuuimc(); ablkekbuuimc.Aaxfyerenjmfe(2); Console.ReadKey(); }
如果覺得因為創(chuàng)建一個類需要的內(nèi)存太大,那么我使用下面的代碼,只是拿到一個類型,但是需要的內(nèi)存是 8M 因為程序會把另一個程序加載
static void Main(string[] args) { Type t = typeof(Ablkekbuuimc); Console.ReadKey(); }
下面來換個方式寫,取消對垃圾程序的直接引用。使用 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 之后實際上內(nèi)存也沒有減少,所以建議不要使用程序集加載方式,這個方式使用很多內(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 讀出來,然后加載,這個方法需要很多的內(nèi)存。
總結(jié)
以上所述是小編給大家介紹的C# 代碼占用的空間,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
欄 目:C#教程
下一篇:WPF實現(xiàn)鐘表效果
本文標題:詳解C# 代碼占用的空間
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5257.html
您可能感興趣的文章
- 01-10C#實現(xiàn)讀取被進程占用的文件實現(xiàn)方法
- 01-10C#一個簡單的定時小程序?qū)崿F(xiàn)代碼
- 01-10C#獲取網(wǎng)頁源代碼的方法
- 01-10C#中Socket通信用法實例詳解
- 01-1010個C#程序員經(jīng)常用到的實用代碼片段
- 01-10C#裝箱和拆箱原理詳解
- 01-10C#導出網(wǎng)站功能實例代碼講解
- 01-10C#類的多態(tài)性詳解
- 01-10C#創(chuàng)建不規(guī)則窗體的4種方式詳解
- 01-10C#中深度復制和淺度復制詳解


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什