请问VB的内存机制是什么

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

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

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

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

|---------|------|----|------|-----|----|----------------|
| | | | | | | |
程序开始 计算完毕后等待 等待 等待: 这个时间段应该都是等待时间,但是中间出现了内存将到程序
执行主体计算 主体计算 计算 刚启动时的消耗状态,为啥这个地方不像前面一样是个
直线呢??难道是因为垃圾收集了????
...全文
110 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)

7,785

社区成员

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

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