是不是代码会占用空间,如果一个程序初始化需要 100M 的代码,那么在他初始化之后,这些代码就没有作用了,他会不会占空间?本文经过测试发现,代码也是会占空间。

我写了2k个垃圾类代码,然后把他放在一个项目 BhgpsWnb,使用另一个项目去引用他。是不是觉得软件在运行的时候就需要很多的内存来放代码?

引用垃圾程序的项目是 ReKlnma ,先只是在引用添加项目引用,然后在不使用 BhgpsWnb 这个项目的代码,我运行下面的代码

        static void Main(string[] args)
{
Console.ReadKey();
}

占用 7 M 内存,而如果运行了存在 2k 垃圾代码 BhgpsWnb 程序,就需要 8M 。使用方法是创建一个类,这个类就是垃圾代码里面的一个,这样就需要把dll放在内存。

        static void Main(string[] args)
{
var ablkekbuuimc = new Ablkekbuuimc();
ablkekbuuimc.Aaxfyerenjmfe(2);
Console.ReadKey();
}

如果觉得因为创建一个类需要的内存太大,那么我使用下面的代码,只是拿到一个类型,但是需要的内存是 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();
}

结果使用内存需要 8M 多,所以代码也是需要内存的,一旦加载了就不会从程序集卸载。

如果是加载程序集,那么加载程序集就需要很多的内存,即使卸载程序也没有用

        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的内存,在后面使用 Unload 之后实际上内存也没有减少,所以建议不要使用程序集加载方式,这个方式使用很多内存。

可以通过指定名称加载,可以看到下面的代码需要使用内存比较小,需要 9M ,但是 Unload 之后没有减少内存

        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 读出来,然后加载,这个方法需要很多的内存。


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

C# 代码占用的空间的更多相关文章

  1. 2018-8-10-C#-代码占用的空间

    title author date CreateTime categories C# 代码占用的空间 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17:23 ...

  2. C++的引用类型的变量到底占不占用内存空间?

    ——by  karottc 分析一下 C++ 里面的引用类型(例如: int &r = a;  )中的 r 变量是否占用内存空间呢?是否和  int *p = &a;  中的 p 变量 ...

  3. Linux内存管理 一个进程究竟占用多少空间?-VSS/RSS/PSS/USS

    关键词:VSS.RSS.PSS.USS._mapcount.pte_present.mem_size_stats. 在Linux里面,一个进程占用的内存有不同种说法,可以是VSS/RSS/PSS/US ...

  4. C++中class在实例化前到底占用多少空间

    最近忽然想起一个问题,C++中class在实例化前到底占用多少空间?我隐约记得书上是这么说的“类在实例化时才分配空间”!但是当我写下这个小程序的时候,杯具产生了—— #include<iostr ...

  5. Oracle查看占用表空间最大的表(排序)

    场景:在做数据库巡检时,检查大表是必不可少的操作,可以查看各表占用表空间的大小 代码: as sizes,q.num_rows,t.segment_type from dba_segments t l ...

  6. MySQL中查询所有数据库占用磁盘空间大小

    查询所有数据库占用磁盘空间大小的SQL语句: 复制代码 代码如下:select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2), ...

  7. 编写Java程序,在一个文件夹内,查找占用磁盘空间最大的 jpg 文件,并输出文件大小

    查看本章节 查看作业目录 需求说明: 在一个文件夹内,查找占用磁盘空间最大的 jpg 文件,并输出文件大小 实现思路: 创建ImageFileFilter类实现FilenameFilter接口,且重写 ...

  8. Projects\Portal_Content\Indexer\CiFiles文件夹下文件占用磁盘空间过大问题。

    C:\Program Files\Microsoft Office Servers\12.0\Data\Office Server\Applications\9765757d-15ee-432c-94 ...

  9. linux下使用 du查看某个文件或目录占用磁盘空间的大小

    du -ah --max-depth=1     这个是我想要的结果  a显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小但是由于用了--max-depth选项,表示显示目录下所有 ...

随机推荐

  1. 在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

    前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Ex ...

  2. XML Web Service架构图

  3. 【cocos2d-x 手游研发----精灵的八面玲珑】

    继续上一篇文章继续聊吧,这章内容会比较多,也会附上代码,很多朋友加了群,大家在群里面探讨了很多东西,这让大家都觉得受益匪浅,这便是极好的,废话不多了,精灵是游戏的重要组成部分,那ARPG里面的精灵必然 ...

  4. XPath高级用法(冰山一角)

    运算符+内置函数 使用XPath选择元素时,使用运算符+内置函数来进行筛选: .//div[contains(@class,"ec_desc") or contains(@clas ...

  5. Uliweb之 ORM基本使用(Sqlalchemy)

    参考:http://limodou.github.io/uliweb-doc/zh_CN/db/orm.html#title_1-2 ORM基本使用¶ 使用要求¶ 需要安装sqlalchemy 0.7 ...

  6. Service的学习代码

    1. startService(new Intent(MainActivity.this, MyService.class))------->stopService(new Intent(Mai ...

  7. 3.jquery在js文件中获取选择器对象

    一.常用的选择器有一下几种: 1.标签选择器 2.类选择器 3.id选择器 4.并集选择器 5.层级选择器 二.如何获取选择器对象: <!DOCTYPE html> <html la ...

  8. 变不可能为可能 - .NET Windows Form 改变窗体类名(Class Name)有多难?续篇

    发布<.NET Windows Form 改变窗体类名(Class Name)有多难?>转眼大半年过去了,要不是在前几天有园友对这篇文章进行评论,基本上已经很少关注它了,毕竟那只是一个解惑 ...

  9. java实现fp-growth算法

    本文参考韩家炜<数据挖掘-概念与技术>一书第六章,前提条件要理解 apriori算法. 另外一篇写得较好的文章在此推荐: http://hi.baidu.com/nefzpohtpndho ...

  10. 一:使用maven构建项目

    一般情况下:使用maven构建项目有两种情况: 1:用maven构建java项目: 2:用maven构建javaweb项目: 还有一种经常需要使用到的就是用maven构建项目模块:如:一个父项目用来作 ...