Windows一个程序究竟用多少内存?

程序运行时的内存空间分布 我们在写程序时,既有程序的逻辑代码,也有在程序中定义的变量等数据,那么当我们的程序进行时,我们的代码和数据究竟是存放在哪里的呢?下面就来总结一下。 一、程序运行时的内存空间情况 其实在程序运行时,由于内存的管理方式是以页为单位的,而且程序使用的地址都是虚拟地址,当程序要使用内存时,操作系统再把虚拟地址映射到真实的物理内存的地址上。所以在程序中,以虚拟地址来看,数据或代码是一块块 阅读详情

 首先声明:Virtual memory 和 memory swapping的概念对于UNIX等系统是两个界限很明显的概念,但是对于windows系统来说区别这两个概念无疑是没有意义的,在windows封装得复杂而又机密的虚拟内存管理技术下研究与区别他们没有什么实际意义。
  注意:以上声明很重要,否则你几乎可以把下面我的程序与分析全盘否决,呵呵
  最近工作需要研究linux系统编程,需要了解LINUX虚拟内存管理技术,看到一本译本好书《深入理解LINUX虚拟内存管理》原书名:《understanding the linux virtual memory manger》作者爱尔兰人Mel Gorman。
  标题是内存的东东,我们先了解一下物理内存和虚拟内存。物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了.看机器配置的时候,看的就是这个物理内存。如果执行的程序很大或很多,就会导致物理内存消耗殆尽.为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。
  一个程序,不可避免地要用到虚拟内存,因为不频繁执行或者已经很久没有执行的代码,没有必要留在物理内存中,只会造成浪费;放在虚拟内存中,等执行这部分代码的时候,再调出来。Windows 的任务管理器可以帮助我们看到进程的虚拟内存.调出任务管理器,点击菜单“查看”-“选择列”,在出现的窗口中,钩上“虚拟内存大小”,如下

点“确定”,这个时候,进程列表中已经显示各进程的虚拟内存大小,如下

一个程序到底应该使用多少虚拟内存呢?不一定,但是应该以恰到好处的符合虚拟内存原本作用为最好,下面将探讨表面看起来调用了大量图片、大量运行库的程序,为什么才“占用”不到 1 MB 的内存的原因。
  通过BCB6的WinSight32,以及SPY++查看原来是 SetProcessWorkingSetSize 函数的调用造成的。(这话不严谨,也不知道怎么表达更好,讲究着看吧)
  MSDN 对该函数的表述(翻译):使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放;当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数.
  也就是说,该函数不是节省内存,而是强制把进程的物理内存搬到虚拟内存中.
  另外有一些资料上说,该函数“将有可能导致缺页中断,严重影响性能”.
函数原型:

BOOL SetProcessWorkingSetSize( HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, SIZE_T dwMaximumWorkingSetSize );
  我们用 VB 来做这么一个简单的例子,是程序占用 300 KB 内存吧。建立一个标准的 VB 工程,在 Form1 中放置一个 Timer1 ,把 Interval 属性设置为 1000 (即 1 秒).然后在代码编辑框中输入以下代码:
Private Declare Function SetProcessWorkingSetSize Lib "kernel32" (ByVal hProcess As Long, ByVal dwMinimumWorkingSetSize As Long, ByVal dwMaximumWorkingSetSize As Long) As Long Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Sub Timer1_Timer() SetProcessWorkingSetSize GetCurrentProcess(), 50000, 100000 End Sub
  然后生成 工程1.exe,执行,调出任务管理器查看,发现内存占用才 320 KB.如果把定时器关闭,这进程的内存一般 4 MB左右。必须定时执行该函数,否则虚拟内存会慢慢被调出来,恢复原来的内存大小。如果要使一个本来需要占用大量内存的程序减低到几百 KB ,使用同样的方法即可。
  如果 SetProcessWorkingSetSize 函数被正常使用,是非常有用处的.但是为了蒙骗用户的眼睛,每秒,甚至几十毫秒就把大量内存往虚拟内存里面压,就会带来无可预计的危害.看看这篇文章怎么说:“因为他只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用.如果你强制使用该方法来设置程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换.”.
  没错,如果你使用了这类软件,意味着你的硬盘将每秒将 I/O 大量数据;硬盘的磁针将拼命旋转...(当然硬盘磁针不可能不旋转^_^,只是选择得更厉害而已).
  不是说 BT 很伤内存吗?不然,因为现在大多 BT 软件都有缓存技术.且看 Bitcomet 官方对缓存技术的说明:“传统BT高速下载时硬盘会响得很厉害,这是大量的随机读取造成的.... BitComet可以由用户设置缓存大小.... 可以明显地看出牺牲一小部分内存作缓存对硬盘的保护作用.”
  是不是有种心寒的感觉?一类软件宁愿牺牲内存,也要减少保护硬盘;而另外一类软件,却为了欺骗用户,让CPU、硬盘更加奔波......这类软件不少,我以其中一个桌面工具为例,揭穿它的假面具(不点名字了).运行该软件后,随意操作一下,然后打开进程管理器,把虚拟内存列调出来。OK,20 MB 虚拟内存,而只有 632 KB 物理内存.细心的你会发现,大概每 1 秒,该行都有闪烁的感觉,没错,这正是每秒调用 SetProcessWorkingSetSize 的结果.另外,我们打开 Norton Process Viewer ,查看该进程的 CPU 占用情况,可以看到,就算没有操作该软件,但是每秒,都有 3% 的CPU占用起伏(虽然这并不能说明什么).另外,内存框中可以看到物理内存和虚拟内存的占用,两者相去甚远.此外,可以用 Hook API 技术来证明每秒调用 SetProcessWorkingSetSize 的行为。
  这篇文章只想让用户了解软件占用资源的实际.而程序员应该把下功夫,真正从代码中减少内存的消耗,而不是一味忽悠用户。

转自( http://club.chinaren.com/49/116110957 )

一个完整的吃内存程序 一个完整的吃内存程序作者:苏显斌日期:2006年5月24日这个程序是本人在公司测试自己编写的安装程序其间编写的一个小程序,主要目的是用来测试本机在不同剩余内存的情况下,安装程序执行的情况,现在把这个工具放上来给大家共享,希望有用得到的,同时也希望各位在阅读代码的过程中,发现有设计、编码等问题,不吝给予指出。 一、             界面设计 二、          阅读详情

相关推荐

32 位模式下 C/C++ 程序到底可以用多少内存

此文版权属于作者所有,任何人、媒体或者网站转载、借用都必须征得作者本人同意! 32 位的程序寻址空间是 4G,因此能用的内存应该有 4G,除掉一些系统等使用的乱七八糟的东西,3G 内存应该没有问题吧,这些只是猜测,写个程序测一下,结果如下: 测试结论: 1.        栈内存最大可用 768k 左右; 2.        堆内存最大可用 1.586G 左右。

智勇软件开发专栏 2250

计算机cpu任务管理器,任务管理器cpu多少才是正常

Windows任务管理器提供了有关计算机性能的信息,并显示了计算机上所运行的程序和进程的详细信息;下面是小编带来的关于任务管理器cpu多少才是正常的内容,欢迎阅读!任务管理器cpu多少才是正常:使用率只要不是一直是50%以上,都算正常的。没跑其他程序的时候小于15%都是正常的。windows在后台有不少进程在运行,在打开“任务管理器”查看CPU使用率的时候,“任务管理器”本身也要占一定的CPU使用...

weixin_42135462的博客 5275

一个进程最多能包含多少线程

//小watch水平有限,希望大家多多指正文中的错误,共同进步 最近在学习os的多线程课程,第一个实验室关于windows的多线程,用mfc实现。实验蛮简单的,但是,我不由想到了,一个进程最多能包含多少个线程。 在网上查了查,貌似也没找到多少这方面的资料。大部分都是关于服务器多线程链接sever的,关于本机可执行exe的进程数倒是没有什么涉及。 我觉得唯一一个有用的出处:http://bbs

secondwatch的专栏 1万+

一个程序最多能占用的内存大小

目前我们主要都是在用 64bit 的机器。因为 264 数字过于大,即便是虚拟内存都不需要这么大的空间。因此通常操作系统会允许进程使用非常大,但是不到 264 的地址空间。通常是几十到几百 EB(1EB = 106TB = 109GB)。

qq_37247026的博客 1647

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

Time_1023的博客 1873

构建可编程记忆系统:OpenClaw-SuperMemory本地部署与智能知识管理实战

在信息过载的时代,高效的知识管理与智能检索成为技术从业者的核心需求。向量数据库与嵌入模型技术通过将文本转化为高维向量,实现了基于语义相似度的智能搜索,突破了传统关键词匹配的局限。这项技术的核心价值在于将静态存储的信息转化为可动态查询和计算的知识资产,极大地提升了信息调用的准确性和效率。其应用场景广泛,从个人笔记管理、对话历史归档到企业知识库构建都能发挥关键作用。本文聚焦于开源项目OpenClaw-SuperMemory,它正是基于这一技术栈,通过本地化部署实现了可编程记忆系统的构建。项目集成了ChromaD

weixin_42525482的博客 319

32位模式下C/C++程序可用最大内存

关于32位程序申请大内存问题(1.6G). 我在win7 64系统上面测试 Visual studio 10 int* Test=new int[1024*1024*200]; int* Test2=new int[1024*1024*200]; 申请1.6G内存. 抛出: cpptest2.exe 中的 0x770e15ee 处有未经处理的异常:  Microsof

三少GG 8375

卡诺图化简法

目录 1.学前需要了解知识点 2.卡诺图(karnaugh map) 3.逻辑函数的卡诺图化简法 4.总结 1.学前需要了解知识点 最小项的定义 最小项的表示方法 最小项的相邻性 最小项的定义:一个函数的某个乘积项包含了函数的全部变量,其中每个变量都以原变量或反变量的形式出现,且仅出现一次,则这个乘积项称为该函数的一个标准积项,通常称为最小项。 最小项的表示方法:通常用来表...

hahasusu的专栏 17万+

windows平台一个程序究竟占用多少内存?

http://blog.youkuaiyun.com/jaminwm/article/details/1394993

痞子龙3D编程 3414

Multisim实战:从8选1到32选1数据选择器的完整搭建指南(附常见问题解决)

本文提供了一份详尽的Multisim实战指南,手把手教你从基础的8选1数据选择器开始,逐步级联搭建16选1乃至32选1数据选择器。文章深入剖析了级联的核心逻辑、片选方案以及使用译码器的专业方法,并附带了电源连接、输出冲突、信号毛刺等常见问题的诊断与解决技巧,帮助电子工程学生和爱好者扎实掌握数字电路的系统设计与仿真调试。

dd012的博客 730

AgentScope Java 2.0 项目实战:教你完整搭建企业级多租户AI数据分析Agent平台

本文详细讲解如何从零开始构建一个企业级多租户AI数据分析Agent平台(agentscope-dataagent)。涵盖项目的环境准备、项目骨架搭建、后端15个核心模块开发(认证授权、Agent网关、会话管理、SSE流式聊天、能力市场、Webhook通道、Docker沙箱等)、前端完整开发(路由守卫、SSE流式读取、28个页面组件)、内置资源定义、构建打包、测试验证及单机/Docker/分布式部署全流程。

program哲学 597

读书有感:windows平台一个程序究竟占用多少内存?

首先声明:        Virtual memory 和 memory swapping的概念对于UNIX等系统是两个界限很明显的概念,但是对于windows系统来说区别这两个概念无疑是没有意义的,在windows封装得复杂而又机密的虚拟内存管理技术下研究与区别他们没有什么实际意义。注意:以上声明很重要,否则你几乎可以把下面我的程序与分析全盘否决,呵呵        最近工作需要研究

夜澜偶作庄周梦 酒后聊为楚客狂 8430

专为AI打造的浏览器:内存占用仅为Chrome的1/9、比Chrome快11倍(Docker部署教程,支持飞牛nas等服务器部署)

🚀 专为AI打造的无头浏览器来了! 用Zig从零构建,内存仅Chrome的1/9,速度快11倍,原生CDP协议支持Docker部署,适合爬虫、自动化测试和AI代理应用。✨

XiaoqiangClub的博客 732

64位系统下一个32位的程序究竟可以申请到多少内存?

64位系统下一个32位的程序究竟可以申请到多少内存? cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推。32位操作系统针对的32位的CPU设计。64位操作系统针对的64位的CPU设计。操作系统只是硬件和应用软件中间的一个平台。我们的CPU从原来的8位,16位,到现在的32位和64位。 背景: 电脑的内存是8GB,装的是32位的Win...

《好好先生》专栏 1845

Far planner代码系列(2)

graph_decoder系列(2) 承接上文 我们接着来看decoder_node.cpp的代码部分 void GraphDecoder::Init() { /* initialize subscriber and publisher */ //graph_sub_ 订阅节点/robot_vgraph 其类型是visibility_graph_msg/Graph的消息 graph_sub_ = nh.subscribe("/robot_vgrap...

博客 1534

A2A 协议详解:Agent Card 的设计与实现

Agent Card 是 Agent2Agent (A2A) 协议中实现智能体发现与互操作性的核心组件。本文将深入剖析 Agent Card 的设计理念、关键字段及其在智能体生态系统中的作用。我们将通过详细的 JSON Schema 解析和 Python SDK 示例,帮助您理解如何精确地定义和发布智能体能力,为构建可发现、可协作的 AI 智能体奠定基础。当您使用a2a.Agent类初始化一个智能体时,SDK 会根据您提供的参数(nameversion等)自动构建内部的 Agent Card 表示。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1476

Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么影响?...

Windows使用一个系统:虚拟寻址系统。该系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全有Windows后台管理,其实际结果是32位处理器上的每个进程都可以使用4GB的内存------无论计算机上有多少硬盘空间(在64位处理器上这个数值会更大)。这个4GB内存实际上包含了程序的所有部分------包括可执行代码,代码加载的所有dll,以及程序运行时使用的所有变量的内容。这个4...

weixin_33758863的博客 127

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

一个程序最多可以使用多少内存?

在虚拟地址模式下,一个程序可以使用的内存容量跟计算机的物理内存(也就是你的内存条)没有关系,它由虚拟地址的取值范围决定。 32位操作系统 在32位操作系统中,程序能使用的最大内存是 4GB,也就是2的32次方。即使你的电脑安装的是16G的内存条也没用,剩下的12G只能空闲着。 让你买那么大的内存,浪费了吧! ...

weixin_42709563的博客 8876

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【内存管理】

一、实验目的( 1) 通过对 Windows xp“任务管理器”、“计算机管理”、“我的电脑”属性、“系统信息”、“系统监视器”等程序的应用,学习如何察看和调整 Windows 的内存性能,加深对操作系统内存管理、虚拟存储管理等理论知识的理解。( 2) 了解 Windows xp 的内存结构和虚拟内存的管理,理解进程的虚拟内存空间和物理内存的映射关系。二、总体设计2.1设计步骤(...

我的书包哪里去了 2610

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

关于计算机程序的内存分配

学习计算机语言有好几年了,程序也编了不少,但是今天才彻底搞清楚Windows的内存分配机制,丢人啊。写出来,分享一下.   一个有c++编译的程序占用的内存分为以下几个部分: 1、栈区:栈的特点就是后进先出。这个是由编译器自动分配释放,一般用来存放局部变量的值以及函数的参数值。 2、堆区:进出随意。一般有程序员分配和释放,如果程序员没有释放,那么等到程序结束后,操作系统会自动收回。 3、全局区(

nonths的专栏 712

[多线程] Windows和Linux中一个线程占用多少内存

之前有看到网上的文章,说在linux中一个线程占用8M的内存。也有文章说这种说法不对。这里简单看一下,windows和linux中,一个线程占多大。

zlllc的博客 1400

通过一个最简单的程序入门Windows编程

这篇文章,我们通过一个最简单的Windows程序,大体感知一下Windows编程。完成我们在Windows编程中的“HelloWorld”。

刘伟佳的博客 2万+
上一篇: More on Memory Usage(.NET内存利用率)
下一篇: SetProcessWorkingSetSize的实例
王子样
博客等级 码龄23年 19粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值