
内存类型与查看方法调试查看● 工具WinDbg● 命令!vad查看 VAD虚拟地址描述符树查看进程内存区域信息两大类虚拟内存类型标记特点例子私有内存 PrivateVAD 标记 Private物理页仅当前进程独占别的进程不能访问栈、堆、普通动态分配内存映射内存 MappedVAD 标记 Mapped多个进程页表可指向同一份物理页实现共享DLL 模块、内存映射文件基础单位物理页固定 4KB0x1000内存申请的两大底层方式✅ 只有下面这两种是直接向操作系统内核申请虚拟内存malloc/new/HeapAlloc 属于二次分配私有内存VirtualAlloc / VirtualAllocEx● VirtualAlloc当前进程申请内存● VirtualAllocEx传入进程句柄在别的进程内部申请内存注入常用共享映射内存CreateFileMapping● 多个进程可打开同一个映射对象共享同一份物理页用于进程间通信VirtualAlloc 参数详解LPVOIDVirtualAlloc(LPVOID lpAddress,// 期望起始地址NULL系统自动分配SIZE_T dwSize,// 申请字节大小自动向上按4KB页对齐DWORD flAllocationType,DWORD flProtect);flAllocationType 分配类型● MEM_RESERVE仅保留虚拟地址不分配物理页不占用物理内存● MEM_COMMIT提交建立虚拟地址可在访问时分配物理页延迟分配可以组合MEM_RESERVE | MEM_COMMITflProtect 内存保护属性● PAGE_READONLY只读● PAGE_READWRITE读写● PAGE_EXECUTE可执行● PAGE_EXECUTE_READWRITE读写执行VirtualFree 内存释放BOOLVirtualFree(LPVOID lpAddress,//起始地址与申请的相同SIZE_T dwSize,//释放大小与申请的相同DWORD dwFreeType);dwFreeType● MEM_DECOMMIT取消提交释放物理页保留虚拟地址空间● MEM_RELEASE完全释放虚拟地址 物理页此时 dwSize 必须填 0分配粒度哪怕只申请 1 字节系统也分配一整个 4KB 页面延迟分配即使使用 MEM_COMMIT也不会立刻分配物理页等到代码访问该内存才触发缺页异常分配物理页堆与栈上层内存底层本质栈、堆的大块虚拟地址空间在程序启动时就已经通过 VirtualAlloc 预先向系统申请完毕● malloc / new 底层调用HeapAlloc● HeapAlloc 不是直接进内核申请内存只是在已经申请好的大块内存里面切割小块属于二次分配栈与堆对比栈内存堆内存用途局部变量函数临时数据动态不确定大小的数据管理方式系统自动分配自动释放程序员手动申请、手动释放地址特点地址连续地址值偏高地址相对分散生命周期函数调用自动回收直到调用 free/delete 释放五、总结4. 内存两大底层类型Private 私有内存VirtualAlloc、Mapped 映射共享内存CreateFileMapping5. VirtualAllocMEM_RESERVE 保留地址MEM_COMMIT 提交VirtualFree两种释放模式6. 所有分配按 4KB 页对齐MEM_COMMIT 采用延迟分配物理页7. malloc/new ≠ 系统底层内存申请底层是 HeapAlloc是在 VirtualAlloc 预先申请好的内存块内二次分割8. 栈、堆都属于私有内存在进程启动阶段预先申请虚拟地址空间一句话VirtualAlloc 是向操作系统批发内存malloc 只是在批发来的内存里零售小块