谁能解释一下内存上涨的现象

duyanbin_sy 2008-04-17 09:52:52
现象如下:
1)启动时内存占用 15M
2)打开数据内存占用 20M
3)关闭打开的数据内存占用 19M
4)再打开数据内存占用 20M

为什么第3步关闭后内存没返回到1)的状态.
很多软件都是这样,请问这是怎么回事?

还有句柄数也涨了,也不回到原来的值,用什么对象算增加一个句柄?

...全文
146 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-04-17
  • 打赏
  • 举报
回复
这现象是正常的。用进程管理器查看的是进程所占用的物理内存。程序中分配的都是虚拟内存,如果程序中没有执行LOCK等处理,虚拟内存只有在使用时才会交换到物理内存中,使用完后随时可能交换到到分页文件并释放物理内存,可能立即交换,也可能过一段时间后交换,是系统根据运行情况来处理的。
Kudeet 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 duyanbin_sy 的回复:]
能解释一下任务管理器里的句柄数吗?
[/Quote]

在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task)、实例 (instance)、文件(file)、内存块(block of memory)、菜单(menu)、控制(control)、字体(font)、资源(resource),包括图标(icon),光标 (cursor),字符串(string)等、GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域 (region),以及设备描述表(device context)。

应用程序打开这样的一个对象,通常都会创建一个对应的句柄。

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

====================

ZT:


HANDLE就是PVOID,也就是无类型指针,

上面这些资源的句柄Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么。

句柄与指针确实是完全不同的两个概念。句柄仅仅是一个32位整数,WIN32中用于标记某个系统或进程的对象,可以理解为对象索引(由于M$未完全公开相关技术,在一定程度上只能如此理解),这个索引更像是一种映射关系(从句柄到对象指针的映射),而不是纯粹意义上的“数组下标”。

句柄可以理解为用于指向或标识内存的一块“资源”,这些资源如:文件(file)、内存块(block of memory)、菜单(menu)等等。操作系统通过句柄来定位核心对象和系统资源。指针即为指向内存的“数据或指令”某一单元。

说的确切一点,句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。
Kudeet 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 duyanbin_sy 的回复:]
to 1楼
那什么时释放呢?
[/Quote]

通常是最后退出时才释放某些资源的。
Kudeet 2008-04-17
  • 打赏
  • 举报
回复
这个问题很正常的,没有关系。

1)启动时内存占用 15M
2)打开数据内存占用 20M
3)关闭打开的数据内存占用 19M // 这里说明它只释放了一部分对象
4)再打开数据内存占用 20M

===>

很多程序启动时并不需要把所有的东西都加载进来,而是在需要时加载。
程序通常会在第一次加载后并不完全释放某些东西,这样能加快第二次加载的过程。

只要在用户重复多次操作后,仍然能够保持在一个相近的值这就是正常的。
zhoujianhei 2008-04-17
  • 打赏
  • 举报
回复
句柄由windows对象管理器负责管理,你可以搜索“windows对象管理器”以获取更多的有关对象和句柄的知识。
duyanbin_sy 2008-04-17
  • 打赏
  • 举报
回复
能解释一下任务管理器里的句柄数吗?
zhoujianhei 2008-04-17
  • 打赏
  • 举报
回复
任务管理器中有个 System Idle Process 进程它的优先等级最低,即当它执行的时候会进行内存回收,回收量视内存使用情况而定。
duyanbin_sy 2008-04-17
  • 打赏
  • 举报
回复
to 1楼
那什么时释放呢?
duyanbin_sy 2008-04-17
  • 打赏
  • 举报
回复
windowsXP下的,如:acrobat reader都有这个现象.
闪破风浪 2008-04-17
  • 打赏
  • 举报
回复
操作系统对内存的管理也有关系的!~
hdqqq 2008-04-17
  • 打赏
  • 举报
回复
具体什么程序,什么系统没说清楚很难说,不过象linux操作系统有内存cache的功能,多用几次后top命令显示会占用内存很大,但是都被cache了.
zhoujianhei 2008-04-17
  • 打赏
  • 举报
回复
系统将你使用过的内存先缓存,当再次使用时将提交上次使用过的内存。
duyanbin_sy 2008-04-17
  • 打赏
  • 举报
回复
谢谢几位回复,结贴.
chenyu2202863 2008-04-17
  • 打赏
  • 举报
回复
相差1M并不一定就是1MB

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧