EmptyWorkingSet和内存整理
网络上找了很多关于内存整理的文章,不外乎都是使用EmptyWorkingSet来实现。就如下面这段代码。
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <psapi.h>
#pragma comment (lib,"psapi.lib")
BOOL EmptyAllSet()
{
HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(SnapShot==NULL)
{
return FALSE;
}
PROCESSENTRY32 ProcessInfo;//声明进程信息变量
ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小
//返回系统中第一个进程的信息
BOOL Status=Process32First(SnapShot, &ProcessInfo);
while(Status)
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,ProcessInfo.th32ProcessID);
if(hProcess)
{
SetProcessWorkingSetSize(hProcess,-1,-1);
//内存整理
EmptyWorkingSet(hProcess);
CloseHandle(hProcess);
}
//获取下一个进程的信息
Status=Process32Next(SnapShot,&ProcessInfo);
}
return TRUE;
}
int main(int argc, char* argv[])
{
EmptyAllSet();
return 0;
}
但在实际使用上,只能清理当前帐户启动的进程。其他进程,如SYSTEM帐户启动的程序,都是无法清理。这是因为权限的关系。这个时候只要加一段提升权限的代码即可。
void AdjustTokenPrivilegesForNT()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
// Get the LUID for the EmptyWorkingSet privilege.
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the EmptyWorkingSet privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
}
然后在main的EmptyAllSet();调用之前加入AdjustTokenPrivilegesForNT();即可。这段代码与关机所用的那段很相似,有什么区别的话比较一下就知道了。
另外,很多文章说外面很多内存整理的工具不过如此,我觉得是很不负责任的。如果是使用EmptyWorkingSet实现的话当然是没什么技术含量,但是只要比较一下实现过程就会知道,很多好的内存整理工具的实现方法肯定不是这样的。运行上面这段代码耗时极短,硬盘几乎不进行读写。但是其他的整理工具往往会进行大量的硬盘读写,将内存数据转存到硬盘的分页文件里以达到整理内存的目的。孰优孰劣我不敢说,但是相对来说我还是觉得用EmptyWorkingSet实现来的快一点。
目前为止我还没有发现EmptyWorkingSet执行后会产生什么问题,如果有高人知道这个函数的缺点的话,望不吝赐教。谢谢。
EmptyWorkingSet和内存整理相关推荐
- (转)内存整理的原理 整理自CSDN
内存整理的原理 整理自CSDN 拓荒时代 国内的程序员大多是在 Java 语言中第一次感受到垃圾收集技术的巨大魅力的,许多人也因此把 Java 和垃圾收集看成了密不可分的整体.但事实上,垃圾收集技术早 ...
- 智能内存整理 [免费绿色] 3.0.0.0
软件名称 智能内存整理 [免费绿色] 3.0 适用平台 Windows 98/Me/2000/XP/2003/Longhorn/Vista 软件类型 免费软件 [永久完全免费,每周更新 ...
- 内存整理的原理是什么?
拓荒时代 国内的程序员大多是在 Java 语言中第一次感受到垃圾收集技术的巨大魅力的,许多人也因此把 Java 和垃圾收集看成了密不可分的整体.但事实上,垃圾收集技术早在 Java 语言问世前 30 ...
- 内存整理工具 Memory Booster
电脑在运行一段时间后,内存可用资源就会变少,利用内存管理工具-- MemoryBooster ,能够随时自动调整电脑内存,让系统保有足够的内存可用空间,以藉此提升电脑的运行速度.它的原理是将以往驻留物 ...
- 深入理解C语言变量和内存——整理篇
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangjun_huster/article/details/69486956 1.基本数据类型变量名 ...
- 优秀的windows软件推荐(内存整理和文件解除占用)
1.软媒旗下的pcmaster中的memorymaster.exe(运行内存整理) 2.lockHunter(解除文件占用)
- 【jiasuba】内存碎片不用愁 小巧的整理内存软件
电脑已经成为了人们所必须的工作.娱乐用品,而当时间永久了,发现速度会变的奇慢,只有重新启动一下才能再次顺利地使用.相信很多玩大型游戏或者打开较多网页和同时打开较多软件的朋友们经常碰到这个问题,其实这就 ...
- C#实现清理系统内存
金山内存整理工具.360内存清理工具非常好用,可以将系统内存最小化,提升系统运行速度.其实这些事情C#也可以做到,原理就是对系统进程中的进程内存进行逐个优化. 网上大多推荐使用系统的SetProces ...
- C#实现的系统内存清理工具
金山内存整理工具.360内存清理工具非常好用,可以将系统内存最小化,提升系统运行速度.其实这些事情C#也可以做到,原理就是对系统进程中的进程内存进行逐个优化. 网上大多推荐使用系统的SetProces ...
最新文章
- 扫掠两条引导线_NX10 入门图文教程——异形台架(扫掠或者沿引导线扫掠)
- 【BZOJ】1105: [POI2007]石头花园SKA
- 万物上链: 5G 起跑
- 【Flask】快速入门后台写接口【API】
- 未来:万物皆互联、全民皆社交,人人都是马化腾
- android 的监控讲解,java android网络监测详解
- 初创公司股本结构_我如何向初创公司的开发团队添加一些结构-以及从过程中学到的东西
- win7 ie临时文件夹怎么修改存放位置
- 安装PostgreSQL单机版
- Nginx学习总结(5)——Nginx基本配置备忘
- webpack那些事:浅入深出-源码解析构建优化
- 职场上别人只做不说的潜规则
- header python 环境信息_通过Python扫描代码关键字并进行预警!这样就不会出BUG了吧?...
- Java根类--Object类
- 极大似然估计法(Maximum likelihood estimation, MLE)
- 计算机电子电路原理图,经典六款电路图集锦(图文)
- 网站小图标制作及配置
- 机器人学中一些常用的三角函数公式
- Flask+SQLAlchemy+graphene+docker示例
- python3 面向对象_傻瓜式学Python3——面向对象