当前位置:首页 > Windows程序 > 正文

Windows工作集内存

2021-03-28 Windows程序

Windows任务管理器默认情况下,“内存(私人工作集)”列处于选中状态。


内存 - 工作集:是私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和。
内存 - 峰值工作集:是进程所使用的工作集内存的最大数量。
内存 - 工作集增量:是进程所使用的工作集内存中的更改量。
内存 - 专用工作集:- 是工作集的一个子集,它是描述每个进程所使用的内存数量的技术术语。专用工作集专门描述了某个进程正在使用的且无法与其他进程共享的内存数量。
内存 - 提交大小:是为某进程使用而保留的虚拟内存的数量。
内存 - 页面缓冲池:是可以写入其他存储媒体(例如硬盘)的某个进程的认可虚拟内存数量。
内存 - 非页面缓冲池:是无法写入其他存储媒体的某个进程的认可虚拟内存数量。


一. SetProcessWorkingSetSize 的工作原理

看看这个API                       SetProcessWorkingSetSize

这是从MSDN摘下的原话

Using the SetProcessWorkingSetSize function to set an application‘s minimum and maximum working set sizes does not guarantee that the requested memory will be reserved, or that it will remain resident at all times. When the application is idle, or a low-memory situation causes a demand for memory, the operating system can reduce the application‘s working set. An application can use the VirtualLock function to lock ranges of the application‘s virtual address space in memory; however, that can potentially degrade the performance of the system.

使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存。当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存。应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放。

When you increase the working set size of an application, you are taking away physical memory from the rest of the system. This can degrade the performance of other applications and the system as a whole. It can also lead to failures of operations that require physical memory to be present; for example, creating processes, threads, and kernel pool. Thus, you must use the SetProcessWorkingSetSize function carefully. You must always consider the performance of the whole system when you are designing an application.

当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数。

========================

事实上,使用该函数并不能提高什么性能,也不会真的节省内存。

因为他只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用。如果你强制使用该方法来 设置程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换。


BOOL SetProcessWorkingSetSize(
HANDLE hProcess,
SIZE_T dwMinimumWorkingSetSize,
SIZE_T dwMaximumWorkingSetSize
);


将 2个 SIZE_T 参数设置为 -1 ,即可以使进程使用的内存交换到虚拟内存,只保留一小部分代码

1 。当我们的应用程序刚刚加载完成时,可以使用该操作一次,来将加载过程不需要的代码放到虚拟内存,这样,程序加载完毕后,保持较大的可用内存。

2.程序运行到一定时间后或程序将要被闲置时,可以使用该命令来交换占用的内存到虚拟内存。

二. 区分物理内存、虚拟内存、Working Set(Memory)、Memory

以下来自:

这个问题在CSDN上碰到好几次,我每次都只给出了简单的答案:不要参考Task Manager的Mem Usage数据,那个数据的大小对程序性能没有直接影响。
下面是我分析这问题的一些思路,希望对对这个问题感兴趣的朋友有所帮助

Q: Is .NET Alone?
A:
 Nope! 前面Saucer说过了,这不是.NET的问题,所有Windows程序都有类似的行为。例如下面的C程序:
void main { while(1); }   //死循环,便于我们察看Task Manager
初次运行在我的机器上Mem Usage是632K,把Console最小化以后再恢复,Mem Usage变成了36K。显然,这不是一个.NET独有的问题,而是Windows Memory Management的问题。那么和.NET的GC机制也不会有太大的关系——虽然问题的表现形式很容易让人联想到GC。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69162.html