今天逛博客堂的第二个收获就是:发现有人在讨论.NET的程序为什么一启动就会占用很多内存,然后GC没有什么作用,但是最小化却能够变得很小,恢复正常之后又会变大,但是没有原来这么大。关于这个讨论可以看看这里,思归也有他的见解(是我的见解的一部分)。
但是我有我的见解,不知道大家觉得对不对?我的见解在这里重复贴出来一下:
据我所知,这个问题好像并不是单纯的GC问题,关于这个问题我是这么理解的:
一个程序刚运行的时候,没有经过任何的GC操作,因此有很多的内存浪费。这些浪费一部分是由于GC引起的,但是更多的是由其他问题引起的。比如说:一个ArrayList在不足以保存新内容的时候,会将占用空间翻倍。又比如说:某一些非托管的资源还没有被释放,一部分是根本就没有进行释放,另一部分可能需要运行两次的GC才能够释放(Finalize的问题)。
当一个程序最小化之后,会发生什么呢?GC,然后还会释放很多东西,包括非托管资源(比如Pen的Handle等等),此外也许一些类似ArrayList的浪费可能得到了修正,因此你会看到内存哗啦哗啦的狂减。此外,还有一个东西在起作用!那就是虚拟内存:操作系统会把一些可能不常用的东西给放到虚拟内存里面,所以你会看到这时候这个程序所占用的虚拟内存的总量会增加,增加量的大小因程序而异。这个步骤也许CLR有参与(强制Paging),也许没有。但是可以肯定的是,你看到的非托管程序也会有这个现象,估计这一个步骤也会产生影响。
当一个程序从最小化恢复之后,又会发生什么呢?从虚拟内存搬东西出来,然后产生一些非托管资源,比如GDI资源等等(因为你有界面,所以需要画图像啊)。于是你会看到占用的内存变大了,但是比Load的时候要小,因为有些东西释放了之后不会再产生,修正了的浪费现象也不会有逆过程。
其中,我认为非托管资源是造成这个现象的最大问题,因为现阶段版本的GC无法跟踪非托管资源。如果各位不相信,可以创建一个控制台的应用程序看看,也会有这个现象,但是效果就没那么明显了。
文章来源:http://dotnet.blogger.cn/sumtec/archive/2004/04/13/796.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器