请教: 三层系统中应用服务器程序和SOCKET SERVER的内存占用问题.

zfmich 2005-10-26 07:14:28
运行一周左右,应用服务器程序和SOCKET SERVER都占用6-700M,客户端不能再连上,只能把服务停了,重新运行应用服务器程序和SOCKET SERVER才能正常运行.

用MEMPROOF检查,发现居然提示有些TADODATASET.OPEN都有内存漏洞.这是为什么?

另外,还有什么好办法检查内存漏洞? 谢了.
...全文
463 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
rlqiang 2005-11-11
  • 打赏
  • 举报
回复
你注意看,我还有上面的for ... do呢,主要是判断所有组件(包括子类)是否有那几个属性.
这样你就不需要一个一个的设置属性了.李维的那本<D5.x分步式>不错,挺详细,不过是对D5的,有些地方不一样,要注意.
其实三层也没有什么,技术细节网上很多,主要了解一下三层的思想和深刻的认识COM机制,就能搞好.我搞的时间也不长,我们共同学习.
zfmich 2005-11-11
  • 打赏
  • 举报
回复
TO rlqiang(今天没有钱,明天没有钱,后天......)
谢谢,还没仔细看呢。实际上,现有的系统还不是我开发的,我现在才刚开始接触三层结构.刚找了李维的书正看着呢.

问一下,在Create事件这么处理和直接修改属性有什么不一样吗?
cjf1009 2005-11-11
  • 打赏
  • 举报
回复
学习
rlqiang 2005-11-11
  • 打赏
  • 举报
回复
我系统服务器端快一年了没有问题,不过数据量不是很大的。socket server只设置了使用的端口号。附加参数设置压缩接口,没有用。
senlin1998 2005-11-11
  • 打赏
  • 举报
回复
关注
zfmich 2005-11-11
  • 打赏
  • 举报
回复
TO rlqiang(今天没有钱,明天没有钱,后天......)
谢谢.问一下,你的系统现在能稳定运行多久? 有设置socket server 吗?
zfmich 2005-11-10
  • 打赏
  • 举报
回复
to rlqiang(今天没有钱,明天没有钱,后天......) :

是啊,还望指点指点。
rlqiang 2005-11-10
  • 打赏
  • 举报
回复
你看没有看demo \Midas\SharedConn的那个demo?
我是在那个上面改进了一下,没有发现什么问题。觉得还是不错的。
我觉得你不需要手动Free子RDM,COM机制自己有计数器啊,它会自动释放的。
不知道对你有用没有。
还有,我在子RDMBase的Create事件里这样处理了一下:
for ... do
if Components[i] is TCustomADODataSet then
begin
TCustomADODataSet(Components[i]).CursorType := ctOpenForwardOnly;
TCustomADODataSet(Components[i]).MarshalOptions := moMarshalModifiedOnly;
if TCustomADODataSet(Components[i]).CacheSize = 1 then
TCustomADODataSet(Components[i]).CacheSize := 100;
end;
可以大大减小资源开销。
你先看看,咱们共同学习。
rlqiang 2005-11-08
  • 打赏
  • 举报
回复
请问楼主,你是不是有一个主RDM若干个子RDM?
sdzeng 2005-11-07
  • 打赏
  • 举报
回复
看来这类问题还是和代码具体实现有关系,
估计问也问不出个所以然,

我用了个没办法的办法,
在系统空闲的时候,检查内存使用情况,
超过一定限额了就重新启动IIS释放内存

楼主还是查一下代码,首先排除内存泄露问题,
然后也可以考虑我的救急办法
虽然是不求甚解,但也能对付一阵了
DreamStrat 2005-11-03
  • 打赏
  • 举报
回复
我的中间层是用ADO类连接数据库的,内存使用始终在6M左右 但SOCKET SERVER就会有问题了,长时间的运行,最高能达到200多M

个人感觉只是SOCKET SERVER会存在问题 而且当并发用户多时(超过80个)偶尔会出现Socket Server死锁的情况 不知哪位有什么好的解决方法
zfmich 2005-10-27
  • 打赏
  • 举报
回复
to sdzeng(大头鸟):
说得是. 不过,我想SOCKET 和 WEB 两种连接方式还是不一样吧. 据说SOCKET 就会有MEMORY LEAK, 用DCOMCONNECTION好象就好一些.
sdzeng 2005-10-27
  • 打赏
  • 举报
回复
这和客户端怎么去连接应用服务器关系不大
在中间层DataSetProvider是用COM实现的
zfmich 2005-10-27
  • 打赏
  • 举报
回复
to sdzeng(大头鸟):
我用的是TSCOCKETCONNECTION. 估计一个是因为子RDM没有释放,另外一个可能是ADO.
sdzeng 2005-10-27
  • 打赏
  • 举报
回复
我怀疑是在COM调度那一块有问题

我遇到的情况
占用内存最多的是dllhost.exe
但是分析了一下,可能会用到COM的就两块
一是ADO,另一处是delphi的Webservice

wizardqi 2005-10-27
  • 打赏
  • 举报
回复
我最初也发现这个问题,尽管我使用了无状态服务器,而且使用了DB Pooling技术,但是程序连续运行2周后就会出现内存泄露现象。后来我把服务器端的数据访问机制改成了dbExpress,运行了1个半月了,内存只多了2mb,我想这是操作系统内存调度机制产生的部分碎片吧。
其实想象也有道理,ADODB毕竟使用了自己的内存缓冲机智,所以在服务器也会多down一份数据,当久而久之中间层成了考验ADODB内存维护能力的“专用考察机”了,所以我想你可能也是这个原因吧。你可以写个不带数据访问机制只有各种运算接口的中间件测试一把,相信你会得到内存正常的结论。
zfmich 2005-10-27
  • 打赏
  • 举报
回复
to rlqiang(不留):
谢谢了,等你的好消息.你的意思是用POOLING?

TO lovendII(戒情人):
谢谢. DELPHI好象还没有GC呢.
lovendII 2005-10-26
  • 打赏
  • 举报
回复
内存泄漏问题

表现为:内存回收低位点不断升高(以每次内存回收的最低点连成一条直线,那么它是一条上升线);内存回收的频率也越来越高,内存占用也越来越高,最终出现"Out of Memory Exception"的系统异常。
解决办法:定位那些有内存泄漏的类或对象并修改完善这些类以避免内存泄漏。方法是:经过一段时间的测试、监控,如果某个类的对象数目屡创新高,即使在JVM Full GC后仍然数目降不下来,这些对象基本上是属于内存泄漏的对象了。



//////////不知道这个文章对处理你的问题有没有好处
http://www-128.ibm.com/developerworks/cn/java/j-performance/

应用服务器内存泄露问题诊断一例
zfmich 2005-10-26
  • 打赏
  • 举报
回复
To rlqiang(不留) :

我感觉也是这个原因. 具体怎么释放?
我是这样试的,不知行不行?

var
GenogramCF : TComponentFactory;

...
initialization
GenogramCF := TComponentFactory.Create(ComServer, TGenogramRDMfm,
Class_GenogramRDMfm, ciInternal, tmApartment);
finalization
if Assigned(GenogramCF) then
GenogramCF.Free ; //FreeAndNil(GenogramCF)?
end.

但是,这样改后,自己测试好象也没什么变化.
fanhongbin 2005-10-26
  • 打赏
  • 举报
回复
关注。
加载更多回复(5)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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