THttprio连接WebService的内存泄漏问题。

原来写的一个通过Webservice读取数据的程序,用Delphi7开发的,在服务器上运行一段时间就死掉了,测试后发现是内存泄漏,在任务管理器中平均每次连接大概增长几十K内存,长时间运行后CPU占用率很高,程序停止响应。在国内网站上搜索,关于Delphi连接Webservice的文章本来就很少,内存泄漏相关的更少。不得已看了几天鸟文,终于找到解决方法。
先说一下我的webservice吧,连接到.Net2.0的webservice,返回一个Dataset。在网上可以找到很多如何用delphi返回.net Dataset的文章,大概就是xmlprovider读取httprio返回的xml stream,再用clientdataset读取xmlprovider的数据,有两个难点,一个是必须用工具生成数据集格式文件*.xtr,本来xml有schemer描述,估计可能是delphi对xmlprovider还支持的不是很好,或者对中文支持不好,所以要自此生成格式文件.另外的难点是delphi默认的soap格式(忘了是什么版本)是.net1.0,2.0的格式变了,所以直接用网上的帖子教的方式只能获取到schemer,而没有数据,具体方法是webservice的wsdl描述文件中增加:
initialization
...
  InvRegistry.RegisterInvokeOptions(TypeInfo(MonitorServiceSoap),ioDocument);
这样才能接收到数据,另外httprio需要用UTF-8来传送中文.
说了这么多,其实当初用了几天时间学习怎么用delphi接收.net dataset,现在觉得是浪费时间,自己编写代码解析xml其实是最快捷的方法,不过为了识别中文,必须把utf-8转成ansistring:
  SetLength(s,SOAPResponse.size);
  SOAPResponse.Read(PChar(s)^,SOAPResponse.Size);
  s:=Utf8ToAnsi(s);
解析的代码就不写了.
很多e文帖子说到是InvokeRegistry.pas中TInvokableClass在析构函数中没有释放内存造成,如下:
destructor TInvokableClass.Destroy;
begin
  FreeAndNil(FSOAPHeaders);
  inherited Destroy;
end;
其实是误导,因为调试的时候发现HttpRio根本没有用到TInvokableClass类.
还有一个说到是CreateXMLDocument(在XMLDoc.pas),出了问题,Delphi创建XMLDocument按照从高到低的顺序尝试创建,首先创建xml4的版本,如果失败再继续建立低版本的,如果用户机上没有安装msxml4.0,在创建失败后会丢失内存.作者对代码做了一些修改,说实话我也看不清楚为什么会造成泄漏,但是作者也提出只要安装了msxml4.0就没有问题了,实际上我的机器上已经安装了,所以如果你怀疑的话可以追踪进入这个函数看看是不是第一次创建就成功了,来验证自己是否安装了xml4.我不知道应该如何检索自己的xml版本,希望谁知道的话回复一下.
继续说内存泄漏的问题,问题在于调用webservice方法后返回了某个类型的类,这个类必须手动卸载掉,如下
  mySoap:= GetMonitorServiceSoap(False,httpURL,HTTPRIO1);
  res:=mySoap.webserviceMethord(param);
  FreeAndNil(res);

附:delphi解析.net Dataset的讲解文章:
http://community.borland.com/article/0,1410,28631,00.html

Google的论坛上也有很多直接在Google搜索不到的帖子,在俺差不多绝望的时候终于抓到救命稻草了,^_^
http://groups.google.com/?hl=zh-CN

THttprio连接WebService的内存泄漏问题相关推荐

  1. 异常连接导致的内存泄漏排查

    目录 异常连接导致的内存泄漏排查 背景 详细流程 使用windbg分析dump文件 使用wireshark抓包分析 完成端口和重叠IO 重叠I/O 完成端口 Reactor模型与Proactor模型 ...

  2. 内存泄漏的3个解决方案与原理实现,掌握一个轻松应对开发丨内存池|mtrace||API实现|框架封装|中间件|异步请求|连接池

    内存泄漏的3个解决方案与原理实现,掌握一个轻松应对开发 视频讲解如下,点击观看: 内存泄漏的3个解决方案与原理实现,掌握一个轻松应对开发丨内存池|mtrace||API实现|框架封装|中间件|异步请求 ...

  3. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  4. 关于Javascript的内存泄漏问题的整理稿

    常规循环引用内存泄漏和Closure内存泄漏 要了解javascript的内存泄漏问题,首先要了解的就是javascript的GC原理. 我记得原来在犀牛书<JavaScript: The De ...

  5. 内存泄漏排查攻略之:Show me your Memory

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源| cnblogs.com/yougewe/p/11334342.html java 语言有个神奇的地方,那就是你时不时会去 ...

  6. 掘地三尺,我挖出了这次线上事故的元凶:Java内存泄漏!

    来源:http://www.importnew.com/29591.html 一个凄凉的午夜 一定是网络的问题 一定是 GC 的问题 一定是内存泄漏 真有这么糟糕吗? 还是不行 那现在是怎么回事? 修 ...

  7. 使用Java创建内存泄漏

    我刚刚接受采访,并被要求使用Java造成内存泄漏 . 不用说,我对如何开始创建它一无所知. 一个例子是什么? #1楼 最近,我遇到了一种更细微的资源泄漏. 我们通过类加载器的getResourceAs ...

  8. linux c 内存泄漏调试工具 《valgrind用户手册》 2. 使用和理解Valgrind核心

    valgrind 用户手册原版地址:https://valgrind.org/docs/manual/manual.html 此原文地址:https://valgrind.org/docs/manua ...

  9. Java开发者必须知道的内存泄漏问题

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 简介 Java的核心优势之一是在内置垃圾收集器(简 ...

最新文章

  1. pyzbar Unable to find zbar shared library
  2. autofac JSON文件配置
  3. 花两千元学python_花两万学的python,总结了一点初学者的小技巧,免费送给大家...
  4. 从事前端开发必须要了解的CSS原理
  5. 【python】python 爬虫(python抓取网站的图片)
  6. python搭建网页_使用python快速搭建本地网站
  7. Eclipse下Java项目转web项目
  8. Python在运维工作中的经典应用之ansible
  9. 如何登录新浪微博html5,新浪微博怎么登陆
  10. Rust 从入门到精通12-集合
  11. 开源看板 wekan docker-compose部署
  12. Tomcat重启服务器
  13. NLP自然语言处理系列-音乐推荐系统实战 -基于矩阵分解(SVD)的推荐
  14. 职场PUA:为什么你就不能逼自己一把呢?
  15. python画简单花的代码_Python竟能画这么漂亮的花,帅呆了(代码分享)
  16. 运算(与运算)和|运算(或运算)
  17. Dns与httpDNS的区别
  18. Python爬虫可以爬取什么呢?
  19. 14年至22年,我与世界杯的那些二三事
  20. 爱我专业主题黑板报计算机,我爱我班主题黑板报

热门文章

  1. linux系统时区设置
  2. linux看3D实景
  3. Oracle 10g中对resumable session的增强
  4. OWIN的理解和实践(三) –Middleware开发入门
  5. Ubuntu16.04怎样安装Python3.6
  6. django----admin
  7. 【Python+selenium Wendriver API】之鼠标悬停事件
  8. redis解决“高并发定时秒杀”库存误差问题
  9. 栈的应用--进制转换
  10. asp.net 发送邮件