开篇
当我们说我们要优化应用内存,我们到底要优化什么呢?任务管理器中哪些和内存相关数值都代表什么呢?
内存分类
应用程序与内存
32 位应用程序内存占用示意图
进程空间中的地址(虚拟地址)和物理内存的地址转换如下
ps:以上为计算机操作系统的知识,如果不知道的小伙伴可以自行搜索一下,我在这里就不赘述了
用于查看应用内存的使用情况的工具
任务管理器(系统:win 11)
Peocess Explorer
由于上面两个工具字段有重叠的部分,所以放在一起描述
VMap
纵向字段解释:
- Heap(由new,GlobalAlloc和HeapAlloc等分配)
- Image(可执行文件)
- Managed Heap(由.NET Garbage Collector分配和管理)
- Mapped File(由CreateFileMapping以文件作为back up)
- Page Table(内核里面维护当前虚拟地址控件所需要的内存)
- Private Data(由VirtualAlloc分配)
- Sharable(由CreateFileMapping以内存作为 back up)
- Stack(栈占用的空间)
横向字段解释:
-
虚拟内存(virtual memory)大小同 Process Explorer 中的 virtual size
- Size: 总体大小,包括了commit和reservce的内存
- Committed: committed的大小,包括专用内存和可共享的内存。
- Private:专用内存。(copy-on-wirte属性的页面还没被修改时也属于此类)
-
物理内存(working set),含义和 Process Explorer 及任务管理器中相同:
- Total WS: 所有的 working set=private working set+sharable working set。
- Private WS: private working set。仅属于当前进程的working set。
- Sharable WS。可共享的working set。
- Shared WS。已经共享的working set,这个值应该是sharable working set的一部分或者全部。
一些假装能帮你优化内存的API
EmptyWorkingSet
- 定义:将进程占用的物理内存换出到虚拟内存中(换出单位是物理页面的整数倍,被换出的页的条件可能是进程没有调用的代码、数据等)
- 副作用:
- 再次分配新的对象时,系统需要把一些代码和数据再次换进到物理内存,这时候就会发生页面切换(这个时间可能会很长),而页面切换的时候就会产生页面错误(页面错误是经常发生的),由于页面切换的延时和页面错误,那么就有可能发生内存分配失败,那么你的程序就无法运行。
- 频繁的换页操作会消耗更大的资源
- 千万不能将它作用到你的桌面进程,后果自行尝试😶🌫️😶🌫️😶🌫️
SetProcessWorkingSetSize
- 定义:使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放
- 副作用:当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池
结语
安全感是什么,是你努力为自己筑起的高高的围墙,是无论多晚回家都为你亮着的那盏灯,还是银行卡上那一串缓慢增长的数字呢,我觉得都不是,安全感应该是一种相信,相信哪怕来自于一个陌生人的善意,相信你在那个人心中就是不可替代的,相信自己有抵御任何风浪的能力,归根结底,是要相信所谓的安全感只有自己能给自己。——《我在他乡挺好的》