是不是代码会占用空间,如果一个程序初始化需要 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. 在Windows安装Reids 详解

    今天安装了redis,记录点经验 因为Redis项目没有正式支持Windows. 但Microsoft开发和维护一个针对Windows 64版的redis. 下载地址在微软的GitHub上,地址:ht ...

  2. Eclipse (JavaEE版)中修改web项目的访问路径

    访问路径,也就是指在浏览器中访问该web系统时的根路径,比如http://localhost:8080/xxxx/index.jsp  这里的xxxx. 也就是request.getContextPa ...

  3. CRT和EXCRT简单学习笔记

    中国剩余定理CRT 中国剩余定理是要求我们解决这样的一类问题: \[\begin{cases}x\equiv a_1\pmod {b_1} \\x\equiv a_2 \pmod{b_2}\\...\ ...

  4. bzoj2095: [Poi2010]Bridges(二分+混合图求欧拉回路)

    传送门 这篇题解讲的真吼->这里 首先我们可以二分一个答案,然后把所有权值小于这个答案的都加入图中 那么问题就转化为一张混合图(既有有向边又有无向边)中是否存在欧拉回路 首先 无向图存在欧拉回路 ...

  5. KNN算法的实现(R语言)

    一 . K-近邻算法(KNN)概述  最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类.但是怎么可能所有测试对象都会找到 ...

  6. Mybatis的cache

    相关类:org.apache.ibatis.executor.CachingExecutor 相关代码: public <E> List<E> query(MappedStat ...

  7. Flask从入门到精通之Flask-Bootstrap的使用

    Bootstrap(http://getbootstrap.com/)是Twitter 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代Web 浏 ...

  8. java中的IO流(输入流与输出流)概述与总结

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  9. python-xlwt给excel添加样式

    #coding:utf-8import osimport time        import xlwt filename="test_xlwt.xls"if os.path.ex ...

  10. JavaWeb 基础面试

    1. 启动项目时如何实现不在链接里输入项目名就能启动?  修改Tomcat配置文件 server.xml.找到自己的项目配置 : <Context docBase="oneProjec ...