精易论坛

标题: 让你的E程序占用内存更少 ( 减小任务器里面的占用内存) [打印本页]

作者: 拜佛成魔    时间: 2011-6-4 17:45
标题: 让你的E程序占用内存更少 ( 减小任务器里面的占用内存)
本帖最后由 宇智波·佐助 于 2013-2-7 12:09 编辑

让你的E程序占用内存更少   减小任务器里面的占用内存   !!

2.jpg (25.96 KB, 下载次数: 14)

2.jpg

作者: う网淅乄    时间: 2011-6-4 17:48
这个问题正需要
作者: う网淅乄    时间: 2011-6-4 17:49
额  ...............   要钱......................
作者: a7615432    时间: 2011-6-4 17:50
来看下是什么
作者: mxd001    时间: 2011-6-4 17:50
支持开源~~~~~~
作者: 1072178896    时间: 2011-6-4 17:51
定额了啊 看看吧
作者: 375734602    时间: 2011-6-4 17:51
怎样减少的?
作者: mxd001    时间: 2011-6-4 17:51
测试出了325KB,还不错!
作者: Xiao伍    时间: 2011-6-4 17:51
不懂,具体是什么意思呢???
作者: 窦泽平    时间: 2011-6-4 17:52
学习一下啊- -
作者: askjhgka    时间: 2011-6-4 17:56
一套PHP网络验证源码
作者: 笨潴    时间: 2011-6-4 18:00
{:3_236:}加个内存优化不就行了么
作者: akeyyz    时间: 2011-6-4 18:02
开源的就看看吧
作者: 吾爱编程    时间: 2011-6-4 18:04
什么东西啊?
作者: finemi    时间: 2011-6-4 18:06
难道是自慰骗人的。。
作者: wenda0493    时间: 2011-6-4 18:11
我看看是什么东西啊
作者: 千年眷恋    时间: 2011-6-4 18:23
{:3_234:}真的?
作者: hs11    时间: 2011-6-4 18:25
支持开源~~~~~~
作者: Zero龙少    时间: 2011-6-4 18:27
神马软件这么爽?
作者: 是要不要骑牛您    时间: 2011-6-4 18:31
学习学习。。。
作者: aa295593362    时间: 2011-6-4 18:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: 是要不要骑牛您    时间: 2011-6-4 18:47
EmptyWorkingSet和内存整理
2008-07-14 17:52
网络上找了很多关于内存整理的文章,不外乎都是使用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执行后会产生什么问题,如果有高人知道这个函数的缺点的话,望不吝赐教。谢谢。



作者: 是要不要骑牛您    时间: 2011-6-4 18:48
EmptyWorkingSet和内存整理
2008-07-14 17:52
网络上找了很多关于内存整理的文章,不外乎都是使用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执行后会产生什么问题,如果有高人知道这个函数的缺点的话,望不吝赐教。谢谢。



作者: 弎巳◎    时间: 2011-6-4 19:06
什么呀,,瞅瞅
作者: hack0215    时间: 2011-6-4 19:15
这个问题正需要{:3_245:}
作者: cyzswhaha    时间: 2011-6-4 19:28
顶顶。···  喜欢喜欢。  学习学习
作者: cqjian    时间: 2011-6-4 20:56
看看是什么 呵呵
作者: l凌蓝雪    时间: 2011-6-4 22:01
哇 太强悍了谢谢楼主分享
作者: qdjfkj    时间: 2011-6-4 22:11
这个问题正需要{:3_227:}
作者: liyuan2499    时间: 2011-6-4 22:39
谢LZ 源码不错
作者: 我是耿耿    时间: 2011-6-5 00:26
支持楼主支持一下……说下是什么原理
作者: lsla    时间: 2011-6-5 00:35
让你的E程序占用内存更少   减小任务器里面的占用内存   !!   怎么实现?
作者: 水特罗海姆    时间: 2011-6-5 00:36
这个有讲究 .
作者: 爬上墙头等红杏    时间: 2011-6-5 00:55
看看
学习下
顶下
作者: 醉过知酒浓    时间: 2011-6-5 00:57
嘿嘿,我正好需要这个呢
作者: qq793359277    时间: 2011-6-5 04:27
看看再说{:3_228:}
作者: 1002271001    时间: 2011-6-5 09:37
支持开源..
作者: wkxq    时间: 2011-6-5 10:09
有技术能量哟
作者: 864647046    时间: 2011-6-5 10:09
看看怎么个方法
作者: 694900566    时间: 2011-6-5 10:36
{:3_241:}顶一下咯
作者: 29636595    时间: 2011-6-5 10:44
支持开源{:3_231:}
作者: q1051278389    时间: 2011-6-5 10:46
什么办法啊?
作者: webshell    时间: 2011-6-5 10:46
来看一下...
作者: xiaohan    时间: 2011-6-5 11:12
支持一下!
作者: kunzaiai    时间: 2011-6-5 11:17
神马代码啊 看到这个 我想起了一本小说 枪王···
作者: scivoelx    时间: 2011-6-5 11:20
让你的E程序占用内存更少   减小任务器里面的占用内存   !!
作者: biooly    时间: 2011-6-5 11:31
应该就是好东西了,加油,做出更好的东西来。
作者: 5101798    时间: 2011-6-5 11:33
内存欺骗是什么东西
作者: 忘記    时间: 2011-6-5 11:35
支持 支持   支持
作者: owen800q    时间: 2011-6-5 12:09
发达收复失地饭似懂非懂是
作者: a455611605    时间: 2011-6-5 12:49
谢谢楼主分享
作者: a51322    时间: 2011-6-5 12:54
{:3_244:}这个很好
作者: 风云思星    时间: 2011-6-5 13:05
{:3_244:}我是穷人!
作者: keyway    时间: 2011-6-5 13:09
看看了..............................
作者: 45456465    时间: 2011-6-5 15:19
{:3_233:}用的什么原理啊
作者: asd2233925    时间: 2011-6-5 15:53
什么意思啊??
作者: zhy854185073    时间: 2011-6-5 15:57
{:3_244:}{:3_244:}厉害啊!

作者: 是大哥吖    时间: 2011-6-5 17:13
wa   好厉害啊
作者: 在在    时间: 2011-6-5 17:22
看看具体的

作者: Das0n    时间: 2011-6-5 17:46
我也要这样!
作者: 若相爱    时间: 2011-6-5 18:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: 850589345    时间: 2011-6-5 18:13
谢谢楼主了
作者: a489284224    时间: 2011-6-5 18:15
什么东西啊

作者: 陆宁    时间: 2011-6-5 18:22
kankan这个什么东西啊

作者: 啊颠    时间: 2011-6-5 18:32
什么东西??
作者: 咦一语言    时间: 2011-6-5 18:40
E语言很占内存吗?我不觉得呀!~{:3_234:}
作者: 492129430    时间: 2011-6-5 18:50
好好学习一下
作者: 辉の不去    时间: 2011-6-5 20:55
{:3_226:}回。。。。。。。。。。。。。
作者: |﹎℡若即    时间: 2011-6-5 20:59
学习一下啊{:3_244:}
作者: 1245663822    时间: 2011-6-5 21:55
好东西啊

作者: sbbj7788    时间: 2011-6-5 22:17
看看呀有什么用?
作者: hhjj3388    时间: 2011-6-5 23:34
看看什么原理·!!
作者: 孤★泪痕    时间: 2011-6-5 23:43
让你的E程序占用内存更少   减小任务器里面的占用内存   !!
作者: 小薪    时间: 2011-6-5 23:48
支持楼主!!!
作者: Mr.Yang    时间: 2011-6-6 00:23
必定顶起啊
作者: hxk9608    时间: 2011-6-6 01:21
学习学习{:3_244:}
作者: 圣人模式    时间: 2011-6-6 02:24
这是好东西
作者: 精易⌒小傷    时间: 2011-6-6 22:53
哇咔咔.听说很牛叉
作者: xiongshuai    时间: 2011-6-7 13:02
这个问题早就该解决了。。
作者: 堕落蒽尕黧鸭    时间: 2011-6-7 13:32
实际减少吗!!!?
作者: 堕落蒽尕黧鸭    时间: 2011-6-7 13:33
貌似有点贵哦~~
作者: 8100110    时间: 2011-6-7 15:31
看看 什么东西
作者: leex04    时间: 2011-6-7 18:05
哇咔咔,  弄能挺全的。

作者: q402300320    时间: 2011-6-7 21:24
来看下是什么
作者: 594316795    时间: 2011-6-8 18:08
看看       ~~~~谢谢分享
作者: andyaibing52    时间: 2011-6-10 12:43
学习一下。。哈哈
作者: szk820628    时间: 2011-6-10 13:45
谢谢楼主了。这个很粗补充哦哦
作者: maijia321    时间: 2011-6-10 18:07
顶个啊。需要啊
作者: 小冰    时间: 2011-6-10 21:42
,,要精吗? 坚决不给

作者: lsnanr    时间: 2011-6-10 22:13
不知道 是什么
作者: 361°獨家記憶    时间: 2011-6-11 01:41
这个要怎么做啊 这个要学习了啊
作者: av19881023    时间: 2011-6-11 10:35
看看
·············

作者: hackrzc    时间: 2011-6-11 18:25
拿下 很好1!!
作者: qqwasd    时间: 2011-6-11 19:23
搞错了。评分到沙发了 -
作者: 繁华尘世    时间: 2011-6-11 19:27
怎么弄啊?
作者: 大叔来的    时间: 2011-6-11 19:35
看看、、拿下
作者: 中文易语言    时间: 2011-6-11 23:01
易语言就是占用内存多!
作者: roach    时间: 2011-6-11 23:45
{:3_226:}来看看是什么
作者: jlzai    时间: 2011-6-12 01:01
下载学习下
作者: qq741348872    时间: 2011-6-12 03:10
看一下~~~~~




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4