500分,程序有内存泄露,郁闷中...msxml,com,widestring,olevariant帮顶有分! ( 积分: 100 )

  • 主题发起人 主题发起人 TrustMe
  • 开始时间 开始时间
T

TrustMe

Unregistered / Unconfirmed
GUEST, unregistred user!
问题已经困扰我好几个月了,这好几个月,试了无数的办法都不得果!
我说一下情况,哪位大侠能够帮助解决,500分相送,
1、一个服务程序,自己使用API实现
2、msxml4
3、interbase
4、COM+
5、多线程
我试过的办法有
1、为msxml*添加NoFullGC注册表值
2、使用FreeThreadedDOMDocument
3、添加OANOCACHE=1环境变量
4、全局接口表
5、每个调用成功的CoInitializeEx(nil,COINIT_MULTITHREADED)都保证有一个CoUninitialize
6、CoFreeUnusedLibraries
7、windows提供的线程池函数
8、msxml*.dll在空闲时被卸载
9、程序中使用的各个模块都单独试验过,唯独使用msxml*进行大量操作的模块有内存泄露
10、每个函数体内使用的接口变量使用后都被置为nil
等等其它办法...
现在我怀疑的是WideString和OleVariant变量没有正确释放,哪位大侠在这方面有经验,望不吝
赐教!
因为我的总分并不多,考虑如果问题无果,分数会收不回来,所以问题设置分数不多,但若问题
能够解决,另开帖500分相送!
 
既然每个模块单独使用都没问题,那就是你模块间调用有问题了。
建议使用单元测试。
 
并不是每个模块都没有问题
->9、程序中使用的各个模块都单独试验过,唯独使用msxml*进行大量操作的模块有内存泄露
所以现在我怀疑msxml或com组件方面,我有使用不当的地方,开始的一段时间我曾怀疑msxml有内存泄露,可反复测试后,却找不到毛病,再一想,微软的东西那么多人在用,使用那么广范的,怀疑他似乎也没有道理呀!
 
你用的是哪一套内存泄漏检测呢?
以下是我搜集的几个
Finding memory leaks
http://www.tomore.com/down_file.php?id=17559
Memory sleuth 3.0
http://www.tomore.com/down_file.php?id=3636
Numega.BoundsChecker.v6.5.Delphi.Edition
系列号:5600-0122DF-FF
http://www.tomore.com/down_file.php?id=7797
MemProof 内存清道夫0.9.4.8
http://www.delphifans.com/SoftView/SoftView_1947.html
 
我使用FastMM和BoundersChecker测试过,没有报告内存泄露,之所以我说有内存泄露,是因为程序在运行过程中内存持续增长,一段时间以后,内存耗尽就死掉了!
 
我在出现类似的问题时,
1、首先检查一下代码,如果觉得没什么问题,
2、使用工具检查,如果查不出来,
3、怎么办?累死也要找出来:把功能都注释掉,然后一半一半地添加进去,看到哪一步出现问题,缩小范围后,再一半一半地查找,直到定位问题所在的地方,然后骂上一阵子,靠,怎么这么粗心呐。但最终没有办法时,只能这样,通常到了这一步,应该就可以解决了。
 
或许是 msXML 本身的问题。因为看不到具体的代码,说了等于是瞎猜。我是从你的牢骚贴子 http://www.delphibbs.com/delphibbs/dispq.asp?lid=3662203 转过来的,亲眼看到了这个帖子,令我无语多时。
首先,你能不能向我保证你上面写的这些名词你都已经真正明白了意思?
其次你能不能保证代码的基本质量不会象上面罗列名词那样出现这许多错误?
这种编程技术以外的意外,有一万个人就有一万种可能,神仙都帮不了的哇。
 
新手一个
帮顶一下~~呵
 
你这种情况不叫memory lead, 应该叫做memory use,尽管你对每种情况都设置了释放内存的代码,但这些代码不一定有机会执行,我觉得你应该从你程序的循环当中找问题,看是否有循环导致某个类型的变量不断的create
 
楼主所说的那些,我以前写过,没有问题,我是多线程通COM+访问DB,生成XML,然后提交给WEBSERVER,注意线程的同异步问题,自己程序关键的地方多写LOG,一步一步看,看什么地方有问题,太部分是由于自己的原因造成的.还有就是像东软史克平先生说的一样
 
首先谢谢各位大侠的帮助!
再就是我的语法表达能力的确不咋地,这点我虚心接受批评!
到底是不是Memory Leak,我现在也为难!昨天使用VictorWoo大侠提供的Memory Sleuth工具测试了一下,发现是Virtual Memory在不断地变化,并逐渐呈上升趋势!当所有的线程都关闭后,Virtual Memory回落很小,仍然保持很高的内存值。
我走查了代码,真的不知道到底是什么资源没有释放了!?
现在我想了解的是:
1、使用COM组件,在释放资源方面,需要注意哪些事项?
2、对于msxml*,中类似function selectNodes(const queryString: WideString): IXMLDOMNodeList;这样的函数,我应该使用什么方式调用呢?
1、selectNodes('/*/bill');
2、selectNodes(WideString('/*/bill'));
3、var ws: WideString;ws:= '/*/bill';selectNodes(ws);
4、WideString类型的变量需要我手动释放内存么?
3、对于msxml*中类似var n: IXMLDOMNode;n.nodeValue或n.nodeName调用后返回的值需要我手动释放么?我直接这样调用可以么?var i: integer;i:= n.nodeValue;或var s: string;s:= n.nodeValue;或var b: boolean;b:= n.nodeValue;
4、如果msxml.dll(或者其它COM组件)已经被卸载,是否它申请的内存还在被占用呢?我观察过,当程序中使用msxml的线程都终止后,msxml4.dll就被卸载了!
等待答案!谢谢!
 
一个部分一个部分的测试吧,内存持续增加,导致死的情况有一下两个情况:
1、动态创建对象,并且没有释放,从而导致随着执行时间的推移,创建的对象越来越多,最终内存不够,这个就是最明显的内存泄漏了。
2、程序运行过程中的临时数据的问题,这里举个 例子,比如有的人就申请了一个TStrings变量,当然也在程序退出的时候销毁了这个变量,但是在程序执行过程中,总是不断的add字符串进去,从而导致占用内存不断攀升。
 
帮忙提前下,顶一个~
关注中
 
1、"动态创建对象,并且没有释放"代码我看过好几遍了,估计这种可能性也不大了。
2、“临时数据”程序运行过程中确实有临时数据,但我限制了它的容量,占用空间很小,这也可以排除了。
那位大侠在程序中使用WideString和OleVariant类型变量比较多的,有没有需要注意的地方?
 
好久没有搞三层的系统了,很难给出准确的原因来,但我还建议你将程序分散功能测试,来找到是哪部份功能所产生的内存泄漏问题,再去针对这块代码下工夫。
 
to TrustMe:
I*** 的都不用手动释放吧。从接口继承下来的都有引用计数和自动回收机制。
你说的几种SelectNodes都是可以的。
还有一招建议你试试:
用CodeSite来跟踪每一个方法的进入/退出。
装好以后 Tools -> CodeSite -> CodeSite Method Tracer
这个是从流程上来检查是不是跟预期的一样。
比如我前一段编一个递归程序,不注意就死翘翘,后来导出来一看,就很明了了。
 
谢谢VictorWoo!
哪位大侠在程序中使用msxml比较频繁的,您是怎么使用的!?能不能提供点建议!谢谢!
我一边调试一边等待答案!
 
不知道这种情况你有没有负值为nil,在操作微软的webbrowser的com的时候,都是这样处理的,我想道理都是一样的吧。
var
vHTMLElement: IHTMLElement;
for I := 0 to FHTMLElementCollection.length - 1do
begin
vHTMLElement := FHTMLElementCollection.item(I, 0) as IHTMLElement;
....
vHTMLElement := nil;
 
谢谢cactus123456!
你说的这种情况,开始的时候我没有加,后来修改时我加上了,好像并不管用,也只是拿来测试用,按理说这种情况是不需要处理的!
 
管用的,delphi转bcb程序的时候,bcb中仅仅是=NULL,但是有内存泄漏,但是delphi中也是仅仅=nil就可以了,后来查资料才知道delphi是做的保护的,也就是说=nil时,delphi帮你释放了,但是bcb中就不行,需要vHTMLElement->release()后再=NULL。
1个多月试验的经验!也是问题的最终解决之道。当然,你的程序其他地方有没有问题,因为没有看到源码,也不能肯定。
ps:现象都一样,也是虚拟内存不断的增加
 
后退
顶部