请问VB的内存机制是什么

angeldgz 2009-07-02 05:32:35
VB内存占用情况是怎么样的?
内存释放是即时的还是像垃圾回收那样的?

比如:
Dim Tmp as Object
Set Tmp = new Object '这里创建一个对象,并申请内存
Set Tmp = Nothing '这个地方将对象释放,那么这句执行完毕之后是不是内存就减少了???

我最近用VB做了个程序,结果这个程序的内存占用曲线是这样的

┌──┐ ┌──┐ ┌──┐ ┌──┐
│ │ │ │ │ │ │ │
│ └──┘ └──┘ └─┐ │ └─
│ │ │
─────┘ └─────┘

|---------|------|----|------|-----|----|----------------|
| | | | | | | |
程序开始 计算完毕后等待 等待 等待: 这个时间段应该都是等待时间,但是中间出现了内存将到程序
执行主体计算 主体计算 计算 刚启动时的消耗状态,为啥这个地方不像前面一样是个
直线呢??难道是因为垃圾收集了????
...全文
111 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
angeldgz 2009-07-07
  • 打赏
  • 举报
回复
哦,谢谢了,我再查查什么问题吧
Tiger_Zhao 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 angeldgz 的回复:]
我这个程序是要在服务器上长期运行的,但是就目前的运行情况,大约每过几天,程序就会进入“无响应”状态,需要重新启动才行,自己活不过来了,如果内存分配上没有问题的话,会是其他什么原因吗?[/Quote]
产生“无响应”状态通常是程序进入死循环或无限递归,一般是程序逻辑引起的。
比如用 GetTickCount 计时,一般是定时增加的,但是这个计数器每 49.7 天会累加溢出后归零,就会产生定时减少的情况,很可能引起程序异常。

对操作过程记日志,总会有某些过程在“无响应”时调用次数猛增。
qiu5208 2009-07-06
  • 打赏
  • 举报
回复
太深奥了,没有一篇看的懂
sonic_andy 2009-07-05
  • 打赏
  • 举报
回复
我记得MSDN上说过,就是VB也是使用垃圾回收机制实现内存回收的.
好像是在某个事件发生的时候启动,然后根据对象的引用计数进行释放操作.
对象的释放是程序可以控制的,但内存释放好像不能直接控制,是由系统决定的..
booksoon 2009-07-05
  • 打赏
  • 举报
回复
关注~~~
sonic_andy 2009-07-05
  • 打赏
  • 举报
回复
不好意思,跑题了..
东方之珠 2009-07-05
  • 打赏
  • 举报
回复
学习
嗷嗷叫的老马 2009-07-05
  • 打赏
  • 举报
回复
路过...............关注..............
slowgrace 2009-07-05
  • 打赏
  • 举报
回复
(1)呵呵,又仔细看了一下,感觉你这个曲线好像跟循环引用没关。不过你在9楼提出的问题也许和循环引用有关。

(2)从图上看,貌似你那个突降的等待段并不总是每隔4个出现一次的?
slowgrace 2009-07-05
  • 打赏
  • 举报
回复

帮你把图发上来试试
slowgrace 2009-07-05
  • 打赏
  • 举报
回复
你这个曲线很熟悉啊,几个月前我做个对象集合的测试,也有这样的情况。对象释放是很花功夫的。

另外,如12楼andy所言,如果你的对象们含有循环引用,那么即使你小心地在程序里写了Set Nothing也没有用,统统会到最后应用终止的时候才会释放对象。

可以看看这个帖子:http://topic.csdn.net/u/20090705/04/de76dce2-031d-4566-b1b5-84380558328e.html?seed=2124371899&r=58160483
贝隆 2009-07-04
  • 打赏
  • 举报
回复
学习
boywang 2009-07-04
  • 打赏
  • 举报
回复
不仅仅是vb的内存机制了,应该还设计windows的。
sonic_andy 2009-07-04
  • 打赏
  • 举报
回复
如果是类的话,也有可能存在循环引用的问题..
A引用B,B引用A,典型的是集合中的Item和集合元素中的Parent属性
可以添加一个TearDown函数专门负责显式释放类成员属性中对于对象的引用.
在释放对象之前调用TearDown函数,可以防止循环引用导致的内存无法释放.
angeldgz 2009-07-03
  • 打赏
  • 举报
回复
我这个程序是要在服务器上长期运行的,但是就目前的运行情况,大约每过几天,程序就会进入“无响应”状态,需要重新启动才行,自己活不过来了,如果内存分配上没有问题的话,会是其他什么原因吗?
angeldgz 2009-07-03
  • 打赏
  • 举报
回复
哦,那么照这个曲线的话,程序在内存分配上应该就没有问题了吧 -_-!!
Tiger_Zhao 2009-07-03
  • 打赏
  • 举报
回复
10分钟的间隔就比较长了,你的进程可能被转入硬盘的虚拟内存,那么强制释放保留的空白堆就可以提高交换效率。
也可能其他的原因要求你的进行释放保留的空白堆,多进程系统在内存调配上总会有自己的优化策略的。
angeldgz 2009-07-03
  • 打赏
  • 举报
回复
楼上,请问释放堆的时候是不是除了超过一定时间还有其他的条件吗?
我画的的这个有点不准,我截了个图,麻烦你看一下
http://www.dxabc.com.cn/tmp/MemoryTest.gif
计算是每个小时一次,每次大约计算10分钟左右
其他的时间段都没降下去,而只有第四个段降了,有点琢磨不透。。。
Tiger_Zhao 2009-07-03
  • 打赏
  • 举报
回复
一个程序至少有一个进程,一个进程至少有一个线程。
一个进程由代码段、数据段、堆栈段组成,任务管理器中的内存用量统计的是这3类大小的合计。
·代码段
 编译后的可执行代码,大小不变,数量1。
·数据段
 大概可以理解为存放常量的空间,大小不变,数量1。
·堆栈段
 变量、参数的分配空间,分为两部分:
 1)栈
  大小固定,每个线程1个。一般 VB 程序线程数量1。
 2)堆
  大小不定,初始化时申请数量1,运行中可以向系统申请多个,申请的堆必须释放返还给系统。
  引起内存用量统计大小变化就是由堆的申请/释放引起的。

计算时1个堆不够,需要额外申请,内存达到波峰。
为了降低堆的申请次数,即使进程的所有变量全部释放,也会将空的堆保留一定时间,这就是前面一段锯齿波形中等待时的内存>初始内存。
最后面等待超过一定时间,保留的堆被释放,内存=初始内存。

lyserver 2009-07-03
  • 打赏
  • 举报
回复
至于内存不平稳问题,当代码无问题时,那就是因为操作系统在作调整,因为一个进程好像最多只能锁定16个内存页,一个内存页是4096byte,则一个进程在物理内存中能实际映射的只有64K。当操作系统中进程数量过多时,为了保证系统运行,操作系统会自动将一些进程中使用不频繁的页面交换到磁盘虚拟内存中,以保证有足够的物理内存供其它活动频繁的进程使用,在这个交换过程中,当然会出现内存不平衡的现象,如果系统中进程不多或内存操作不频繁,则不会存在这个问题。
加载更多回复(5)
第一部分 了解COM 第1章 COM概述 何谓CoM COM术语 COM利与弊 COM的好处 COM的局限性 COM组件与接口 何谓接口 接口特征 接口类型 接口规则 接口设计 COM组件的实现规则 实现IUnknown规则 内存管理规则 引用计数规则 COM激活 COM类型 COM客户机 COM服务器 ActiveX控件 COM与面向对象技术 包装 抽象 多态 继承 COMTrader应用程序 小结 第2章 由VC++建立并使用COM服务器 IDL文件 建立第一个COM服务器 定义自定义接口 实现IUnknown和自定义接口 完成COM服务器 生成测试客户机 用ATL建立COM服务器 关于ATL 用ATL建立进程内COM服务器 用ATL建立进程外COM服务器 线程与COM服务器 Win32多线程应用 线程COM组件 自动化与IDispatch 用VC++实现IDispatch ATL与自动化 Automation数据类型 再谈类型库 C++自动化客户机 VB自动化客户机 小结 第3章 用VB建立并使用COM服务器 选择COM项目 设计接口 描述接口 浏览接口 生成对象 使用ClassBuilder 增加属性 增加方法 增加事件与枚举 使用ActiveXDataObject(ADO) 在服务器组件中使用Recordset对象 在客户机组件中使用ADOR 生成断开的Recodset 生成自己的RecodsctS 使用用户定义类型 错误处理 服务器客户机错误处理 使用VBErr.Raise机制VB中使用线程模型 设置线程模型 了解再入性与公寓 小结 第二部分 COM与Internet 第4章 在VC++中建立并使用ActiveX控件 ACtiveX控件概还 属性与方法 控件与容器通信 事件与连接点 建立第一个控件 生成控件 测试控件 增加方法 增加属性 增加事件 增加属性页 允许属性保持 使用控件 建立复合控件 增加复合控件 增加功能 增加事件 处理复合控件事件 处理错误 使用控件 小结 第5章 在VB中建立并使用ActiveX控件 VB控件简介 约束与无约束控件 控件生成技术 属性类型 方法 属性配置 过程属性 环境属性配置 运行时只读属性 只在运行时有效的属性 扩展属性 容器属性 合成控件属性 可关联属性 持续与属性包 属性包 使用ActiveX控件界面向导 了解控件寿命 生成ActiveX控件 生成无约束控件 生成设计时数据约束控件 生成运行数据约束控件 小结 第6章 用VC++建立InternetCOM组件 IEActiveX控件 轻量级控件 安全控件 持续属性 文档对象模型编程 活动服务器组件 活动服务器页面 ASP页面的COM组件 小结 第7章 用VB建立InternetCOM组件 无窗口控件 ActiveX控件容器的线程模型 ActiveX控件的安全性 Web页面访问 VBDHTML项目 DHTML项目基础 DHTML应用程序样本 VBIIS应用程序 WebClass 一个IIS应用程序样本 设计控件 设计控件与HTML文件 样本设计控件 小结 第三部分 了解DCOM 第8章 DCOM概述 何谓DCOM 为什么使用DCOM DCOM操作 DCOM组件位置 进程内或进程外组件 代理 RPC(RemoteProcedureCall,远程过程调用) 调动 数据传递 DCOM配置实用程序 DCOM应用程序的安全机制 验证 授权 加密 整性检查 小结 第9章 用VC++建立DCOM服务器 标准与自定义调动 标准调动 自定又调动 网络通伯 远程激活 AppID注册表项 可配置AppID注册表项参数 IUknown优化 DCOM与NT服务 NT服务解剖 基于NT服务的COM服务器 小结 第10章 用VB建立DCOM服务器 应用程序对象模型 何谓对象模型 如何生成对象模型 DCOM设计准则与技术 再论调动 按数值与按引用 DCOM进程外服务器 建立DCOM组件 增加测试客户机 IIS应用程序 增加WebClasses 使用模板 增加自定义Webltems 远程错误处理 小结 第四部分 了解COM++ 第11章 COM++概述 COM与WindowsDNA 用户界面层技术 中间层技术 数据库层技术 组件服务配置 事务处理 排队组件(QC) 实时结构的限制 事务性消息排队 排队组件结构 排队组件故障恢复 QC安全性 动态负荷平衡 对象地 小结 第12章 用VC++建立COM++组件 ADO编程 ADO与OLEDB VC++中的ADO VC++的ADO扩展 建立COM++应用程序 温习IObjectContext接口 用ATL建立COM++组件 编制基于角色的安全性 处理COM+事务 控制事务结果 指定事务属性 确定事务情境 传递接口指针 共享状态 建立事务性COM+组件 小结 第13章 用VB建立COM+组件 了解事务 事务与多层应用程序 COM+与事务 事务属性:ACID COM+系统简介 COM+运行环境 COM+ComponentServices COM+接口 资源分配器 应用程序组件 探索COM+编程模型 COM+组件作为COMDLL 基本COM+编程规则 COM+API 用VB编程COM+ 对象描述表 COM+组件的生命周期 ObjectControl接口 MTS活动 COM+中生成对象 安全引用 组件之间的参数传递 数据类型 使用分布式事务 分布式事务协调器(MSDTC) COM+事务的工作 事务与有状态对象 使用共享属性管理器(SPMSharedProperyManager) 小结 第14章 了解MSMQ 何谓MSMQ MSMQ的好处 MSMQ组件 队列 消息 MSMQ对象模型 MSMQ设置 MSMQ基础 消息发送 消息接收 MSMQ事件 MSMQ事务 小结 第五部分 高级COM与COM+ 第15章 VC++与VB中的COM+服务 了解COM+激活 描述表包装器 激活顺序 使用即时(JIT)激活 使用对象构造 中性公寓简介 了解同步域 表示事务状态 取得对象信息 使用对象地 对象池的好处 对象地要求 对象地配置 使用排队组件 QC限制 QC配置 QC调用 QC播放控件 使用负荷平衡 负荷平衡要求 负荷平衡配置 小结 第16章 COM与COM+安全性 何谓安全性 WindowsNT安全简介 NT验证 NT扮演 NT访问控制 COM安全结构 验证 访问控制 启动权限 标_ 扮演与掩盖 安全总括 COM+安全 COM+说明性安全 COM+角色 编程COM与COM+安全 整个进程安全 接口级安全 激活安全 服务器方安全 调用描述表安全信息 SecuntyProperty信息 安全性与数据库访问 小结 第17章 Windows2000中的新COM特性 同步机制 COM同步API COM同步接口 异步COM 异步接口构造 异步接口调用 关于异步服务器与客户机 让服务器进行异步处理 调用序列化与自动完成 COM管道 COM管道接口 异步管道与提前读取 调用对象与调用取消 调用取消请求 调用取消处理 轻量级处理器 标准LWH 自定义LWH 小结 第六部分 调试与部署COM和COM+应用程序 第18章 调试与剖析COM和COM+应用程序 调试VB组件 调试MTS组件 调试COM+组件 使用条件编译 调试VC++组件 用VisualStUdioAnalyzer剖析 小结 第19章 部署COM与COM+应用程序 DCOM应用程序部署 配置DCOM服务器 配置DCOM客户机 在Internet上部署 Internet上部署与包装 签名CAB文件 许可ActiveX控件 自动化COM+配置 使用COMAdmin接口与集合 配置COM+应用程序 配置组件 配置角色 部署COM+应用程序 小结

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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