所谓的内存释放工具——原理

本文演示了如何使用SetProcessWorkingSetSize函数调整指定进程(例如QQ.exe)的工作集大小,实现内存释放效果。虽然能暂时减少进程内存占用,但实际效果有限且可能降低系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚才逆向了一个内存释放的小工具,原来是调用了SetProcessWorkingSetSize()函数,MSDN一下。

此函数原型如下:

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

hProcess是进程的句柄,dwMinimumWorkingSetSize和dwMaximumWorkingSetSize分别是设置程序运行空间的最小和最大空间。

其实这个函数的功能就是保留一些必要的代码在内存中运行,其余的直接扔虚拟内存里去了。所谓虚拟内存,其实就是硬盘中划分出来的一片区域用来作内存使用。不过,这个只是暂时性地放进虚拟内存里,一旦程序激活了,内存又会被重新占用。其实这个特性操作系统本身就有的,可以先打开任务管理器,观察某个进程,如果将其窗口最小化后,所占用内存一下子就减小了;一旦被激活,又要开始重新对内存进行占用,这就是所谓的后台运行。

所以事实上并没有节约多少内存,一切都是骗眼睛的,这样做反而增加了内存与硬盘的页面交换频率,硬盘的针就转得更快了,有时反而更降低系统的性能。

贴一段代码:

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
/*
time :    2010.5.9
by     :    乱雪
email:    lx#shellcodes.org
SetProcessWorkingSetSize函数演示
*/
int main()
{
    PROCESSENTRY32 pentry = {sizeof(pentry)};              //填充大小
    HANDLE hPSnap =::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //建立快照
    BOOL bMore = ::Process32First(hPSnap,&pentry);     //得到首个进程

    //循环搜索
    while(bMore)
    {
        if(strcmp("QQ.exe",pentry.szExeFile) == NULL)        //搜索QQ.exe这个进程
        {
            //如果找到,就用OpenProcess获得它的句柄
            //根据MSDN对SetProcessWorkingSetSize的描述,进程必须有PROCESS_SET_QUOTA权限
            HANDLE hProcess = ::OpenProcess(PROCESS_SET_QUOTA,
                                        FALSE,
                                        pentry.th32ProcessID);
        //hProcess不为空就表明获得了句柄值
        if(hProcess != NULL)
            //调用SetProcessWorkingSetSize函数
            ::SetProcessWorkingSetSize(hProcess, -1, -1);
        else
            break;
        }
        bMore = ::Process32Next(hPSnap,&pentry); //获得下一个进程
    }

    ::CloseHandle(hPSnap);   //关闭句柄
    return 0;
}

这段代码演示了对QQ进程(QQ.exe)的进程释放。首先建立一个进程快照,然后开始搜索QQ.exe这个进程,如果找到了就打开它的句柄,然后进行内存释放。

如图,在释放前QQ进程所占的内存大小:

编译运行后,QQ.exe所占用的内存大小,如图:

就这回事儿,晕。

PS:真的很简单  但是没什么大用处。。。。只能骗骗不知道的人了~~~

### Netty HTTPS 内存泄漏解决方案 当面对Netty在处理HTTPS时出现内存增长的问题,通常涉及几个方面的原因分析和对策实施。 #### 1. ByteBuf管理不当引发的内存泄漏 在线上环境中观察到,在解决了长连接前置内存泄漏问题之后,通过日志确认`FullHttpRequest`中的`ByteBuf`被正确释放[^1]。这表明对于每一个读取操作获取到的数据缓冲区(`ByteBuf`)都应当及时调用其`release()`方法来确保资源能够得到回收。如果未能适当地释放这些缓冲区,则可能导致未使用的字节缓存占据大量内存空间而不被垃圾收集器清理掉。 ```java // 正确使用ByteBuf并手动释放它 ChannelHandlerContext ctx; ByteBuf buf = null; try { buf = ...; // 获取ByteBuf实例 } finally { if (buf != null) { buf.release(); } } ``` #### 2. 虚拟内存持续上升的情况排查 针对虚拟内存不断攀升的现象,有经验分享指出可能是由于某些特定场景下触发了不必要的对象创建或是持有过多无用的对象引用所造成的。为了有效定位此类问题的发生位置以及影响范围,可以借助于一些性能监测工具来进行深入诊断,并参照相关资料了解Netty内部是如何实现对潜在风险点进行检测与防护措施的设计原理[^2]。 #### 3. 堆外内存的有效控制策略 除了关注JVM堆内部分配给应用程序的空间之外,还需要重视由DirectByteBuffer代表的直接分配在外存上的区域——即所谓的“堆外内存”。一旦发生该类别的溢出情况,往往难以直观察觉且更难追踪具体成因。因此建议开发者们仔细审查代码逻辑特别是涉及到网络I/O的部分,避免因为疏忽而导致额外开销累积形成隐患;同时积极利用官方提供的指南学习最佳实践案例以提高系统的健壮性和稳定性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值