起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: wangys_yt

[结贴]怀疑平台垃圾回收机制有BUG**

[复制链接]
 楼主| 发表于 2007-10-12 10:15:53 | 显示全部楼层
最初由 yancm 发布
[B]因为我们这里无法重现您的缺陷,请问您报错时代码停在哪儿? [/B]


报错时代码停的位置是变化的,如果是不变的我也不用费那么多事了,肯定是程序有问题了。

估计你们机器的内存配置都比较高,因此很难让内存占满吧,你们可以尝试用512的内存试试啊。反复读取数据试试看。
回复 支持 反对

使用道具 举报

发表于 2007-10-12 10:32:18 | 显示全部楼层
楼主的代码存在以下几个问题,不一定是导致您报错的原因,但是是一种潜在风险,请您注意:
1。您在TBWXX中的LogInfoList是TStringList类型。这种类型是需要释放的。而我看不到您在哪里对此对象进行了释放。如您所说,加载数据量很大,而如果多次运行,这会造成内存溢出。这时的内存回收已经不是我们平台控制,而是操作系统保护性的回收。所以很可能会出现问题,在后面的访问中,出现内存访问错误。
2。您的RESCOMMON单元都是使用StringUtils来处理string.这个单元是为了兼容delphi对string的处理方式而保留的。其实平台的string和Delphi的string并不是一个概念。平台的string是一种.net对象类型。而Delphi的String是一种数据结构。所以在处理时,最好不使用此单元的函数(除非涉及到ASCII码的问题)
比如您用到的MyMidStr,其实完全可以用String.SubString来代替。而Length(String)也可以用String.Length来代替。这是一种更符合平台string数据结构的调用方式。推荐使用。

以上两点请您修改后对调试情况给出反馈。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-12 11:06:44 | 显示全部楼层
谢谢yancm的回复,发帖子这么长时间,终于看见一个我认为比较专业的回复了,再次感谢。我待会修改一下代码看看效果如何。

针对你们说的在你们哪里无法重现,我把我这里出现这个问题的现象给录下来了,大家看看会不会有帮助。

我这是在我们服务器上执行的,2g内存,可以了吧?

附件太大啦,4M多,好像传不上去啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-12 14:34:34 | 显示全部楼层
to yancm:
1.LogInfoList的释放我是放在信息的释放事件中的,我定义的LogInfoList是针对整个信息的一个变量。由于我的程序需要连数据库,上传文件时我又重新建了一个测试的信息和功能,把释放那段代码遗漏了。
2.按照你的建议,我把Length都替换成String的length了,把自己写的那三个处理字符串的函数MyLeftString MyRightString MyMidString中的处理方式也该为通过字符串的SubString进行处理了,可是效果依旧。

测试中发现,当我点击“读取数据”按钮后,系统内存开始上升,但当读取数据处理完毕后,内存并不会下降。这样,当我再次执行时,内存又会继续上升。当我多次执行读取数据时,系统内存就会不够,然后就会出现到达到某一个值后,系统内存开始下降,而此时程序就会停滞。直到内存下降到一定值后才会继续运行或者是报错。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-12 14:51:58 | 显示全部楼层
又测试了几次,发现一个这样的问题:
点击“读取数据”后,内存此时值为671,读取完毕后内存值为721。此时我不做任何操作,发现内存不减少,等10多秒左右后,内存开始减少,此时Business.exe的CPU占用到达98%-100%。这样持续一段时间后,CPU占用开始下降。
通过这个现象我是不是可以这么理解:读取数据结束后,程序代码所使用的内存并不会释放,在间隔一定时间(10S左右),然后系统才会自动释放内存。这样,当我连续读取数据时,就会出现内存只占用不释放的情况,当到达一定程度后,内存不够用了,然后平台会暂停程序运行,然后进行内存释放,释放到一定程度后,平台再继续程序运行。
回复 支持 反对

使用道具 举报

发表于 2007-10-12 15:23:07 | 显示全部楼层
45楼是对的。内存不是使用后马上回收的。因为我们使用的是.net的内存回收机制,暂时无法避免此问题。
暂时找不到解决办法。不过如果您的LogInfoList在每次转载完成后释放一下,可能会对此问题有改善。(相当于自己控制了释放内存的时间,而非要等到系统自动释放时)
由于TStringList不是.net对象,所以.net内存回收机制可能处理不到位。

由于X3 是在Delphi.net发布之前研发的,我们是把Delphi和.net的内存机制进行了糅合。但由于对于.net的核心部分无法深入,所以两者的结合确实比较生硬。

在释放内存时占用大量CPU的问题已经提交缺陷。出错的暂时还无法重现,我们会对此部分加大测试力度。
谢谢楼主的发现,希望今后此部分在您的支持下能更加完善。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-12 16:48:40 | 显示全部楼层
谢谢yancm的答复,虽然结果很令人失望。
这个问题无法解决还真是个麻烦。因为由此造成的结果是程序运行速度很慢,虽然在运行平台下不会出错,但运行的慢也是问题啊。

BTW:那个StringList我在后期测试中给去掉了,因为其中保存的是分析文件时的日志,便于我调试用的。

建议贵公司找台配置稍低的机器试试看,反复运行读取操作,应该会重现的。我觉得这个问题是和内存释放有关的,一台机器的内存再大,反复运行也会出现的,因为每次读取一遍,内存不会马上降低,再次读取就会再次造成内存上涨,多执行几次就会让内存达到峰值。我说的多执行几次不是多运行几次,而是运行起来后,多点击几次读取按钮。
回复 支持 反对

使用道具 举报

发表于 2007-10-17 10:21:08 | 显示全部楼层
缺陷已经提交。先结贴。修正后我们会告知您。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-28 23:36 , Processed in 0.041511 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表