是不是代码会占用空间,如果一个程序初始化需要 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. Android TV Overscan

    本文来自网易云社区 作者:孙有军 开发的TV应用发现在部分电视上可以显示完整,而其他部分电视显示不全,周围都会遮挡了. 原因 这是因为部分老的电视有一个overscan的概览,什么叫overscan呐 ...

  2. Redis持久化————AOF与RDB模式

      1.        官方说明:  By default Redis asynchronously dumps the dataset on disk. This mode is good enou ...

  3. S11 day 94 RestFramework 之 APIView视图

    VIEW视图(Django自带的) 1.  url url(r'login/$', views.login.as_view()), 2.点开 as_view() , as_view()为类方法.  l ...

  4. 程序猿的日常——Java基础之equals与hashCode

    equals和hashCode是我们日常开发最常使用的方法,但是因为一般都使用默认的规则,因此也很少会引起关注.不过了解他们的用途和设计的原则,还是会帮助我们更好的设计代码. equals equal ...

  5. webpack快速入门——实战技巧:优雅打包第三方类库

    下面说两种方法: 一. 1.引入jQuery,首先安装: cnpm install --save jquery 2.安装好后,在我们的entry.js中引入: import $ from 'jquer ...

  6. elasticsearch5.x安装中一些问题的解决办法

    1.root超级用户不能正常启动 由于elasticsearch2.0版本以后不能使用root来启动,所以需要创建一个普通用户来启动. [root@bogon ~]# groupadd elastic ...

  7. WebDriverAPI(3)

    获取页面的Title属性 被测网址http:http://www.baidu.com Java语言版本的API实例代码 String url = "http://www.baidu.com& ...

  8. JavaScript 常见使用误区

    JavaScript 常见使用误区,都是平时开发过程中填过的一些坑,整理记录下. 比较运算符常见错误 //在常规的==比较中,数据类型是被忽略的,以下 if 条件语句返回 true: var x = ...

  9. 微信小程序开发笔记2,底部导航栏tablebar

    底部导航(要在app.js里面配置,也就是把导航的代码写到app.js) 官方文档说最少2个导航最多5个 , "tabBar": { "color": &quo ...

  10. (转) mysql之status和variables区别及用法详解

    原文:http://blog.csdn.net/andyzhaojianhui/article/details/50052117