Visibroker for Delphi(Kylix)有问题,客户端不断访问会造成服务器端内存泄露(20分)

  • 主题发起人 主题发起人 linxiaovoc
  • 开始时间 开始时间
L

linxiaovoc

Unregistered / Unconfirmed
GUEST, unregistred user!
我最近采用Visibroker编写服务器端程序与客户端程序,做完后发现客户端频繁访问
服务器的方法,会产生有规律性的4K倍数的内存增加。为了验证自己程序是否存在内存泄露,
我直接运行Delphi6自带的AccountGui程序,在客户端程序加了一个定时器,使得每隔一段
较短的时间就调用服务器的方法,惊讶地发现server占用的内存也是有上述规律的增加,
这是怎么回事啊,Visibroker是使用人数最多的ORB产品,难道它存在着BUG吗?
 
Visibroker有自己的内存和线程管理方式,在用户请求量变化时可能会自动作一些调节,
可能是这个原因吧。你要看它结束后是否有内存泄露。我曾发现用户请求量增大,然后
再减少,过一段时间后内存占用会降下来。当然它也可能确实是有BUG。
 
Huzzz,我用的是Visibroker for Delphi(Kylix)的,并且我的CORBA服务器端程序是运行在
LINUX上的,不知道您用的是哪方面的。另外对于这个问题应该怎么看待呢,现在兄弟的项目
进度已经到期了,并且是到了服务器端与客户端都做好了才发现这个问题。这可如何是好?
能不能给个意见。
为了这个问题,我下午不得不用ORBIT重写了服务器端代码,现在却因为服务器端的函数传出
字符串参数问题而停住了,唉!
 
用户请求量的增加使得服务器内存的不断上升,如果说用户请求量能够减少的话,那倒还无所谓,
问题是在我的项目中,客户监控程序必须不停地监视服务器的运行状态,这样的话,客户端
每隔几秒就要访问服务器,因此请求量是减不下来的。
 
因为你的项目进度已经到期了,所以你要确信这不是一个BUG,而是正常的反应。
你再看看内存占用是否是不停地增加,永无止境,还是会达到一个水平后稳定下来,
如果是后者,那就是正常拉。
Visibroker for C++、Delphi和Kylix应该是一样的吧,我对LINUX不熟悉,所以
以上说明仅供参考。
 
难道我要把死马当做活马医吗?唉,真不知道如何才好了。
HUZZZ,你是否知道DELPHI如何通过IOR来访问CORBA服务器,我现在缺这方面的材料,以前
有个例子,不知你是否知道,就是WWW.CORBA.COM.CN站长用C++Builder 写的客户端,通过
获取服务器端的IOR来得到服务器对象引用,然后再调用方法,我改写这段代码,但无法调用方法。
例如:
procedure TForm1.test1Click(Sender: TObject);
var
svrObject: CORBAObject;
dwCnnID:integer;
begin
NMHTTP1.TimeOut := 10000;
NMHTTP1.InputFileMode := false;
NMHTTP1.OutputFileMode := false;
NMHTTP1.ReportLevel := Status_Basic;
NMHTTP1.Get('http://192.168.19.28/echo.ior');
//以上得到了IOR字符串,
initcorba;
corba.ORB.Init;
corba.BOA.Initialize(nil);
svrObject := Corba.orb.StringToObject(nmhttp1.Body);
svr := TDvnvshelper.Narrow(svrObject);
//这里得到对象引用吗?下面执行方法
svr.VSServerInit(dwCnnID);
// Timer1.Enabled := TRUE ;
end;
这里就是无法调用服务器的方法。头疼极了。
 
这个我不懂,不过我看那个例子跟你的不一样,它并没有用IOR之类的东西,它使用
NAMING SERVICE时首先获取了一个缺省的根名称空间,然后才用它获取子名称:
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null);
//这一步调用了resolve_initial_references获取缺省名称空间
NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references( "NameService" ));
//这一步获取所需的OBJECT
org.omg.CORBA.Object o = nc.resolve(nc.to_name("corbacounter.example"));
counterinterface = CounterInterfaceHelper.narrow(o);
按照上述方法,你的程序可翻译如下:
var
nc: CosNaming.NamingContextExt;
o: Corba._Object;
svr: TDvnvs;
begin
corba.ORB.Init;
corba.BOA.Initialize(nil);
nc := TNamingContextExtHelper.Narrow(corba.ORB.ResolveInitialReferences('NameService'));
o := nc.resolve('corbacounter.example');
svr := TDvnvsHelper.Narrow(svrObject);
end;
 
关于IOR我帮不上你了。
 
borland中国公司主页上有这个问题的说明,的确是一个bug,
修改很简单,自己去看看吧。
 
HUZZZ,请问你这个nc := TNamingContextExtHelper.Narrow(corba.ORB.ResolveInitialReferences('NameService'));
中的NameService是由谁来指定的?服务器端的吗?
另外o := nc.resolve('corbacounter.example');中的corbacounter.example串又是什么呢,
我知道在orbit服务器端程序中需要指定服务器的命名串,但这与corbacounter.example一致吗?
 
小猪:
  我去宝兰公司看看,多谢。
 
小猪,我在WWW.BORLAND.COM.CN上找不到相关的内容啊,是不是我上错网站了。您是否可以
指点一二。
 
奇怪,还有一个www.borlandsoftware.com.cn,这好象才是中国公司的网站,但上面也没有这
方面的说明。不会是又找错地方了吧。
 
他说的是这个:
http://www.borland-inprise.com/support/delphi/VB-Delphi.html
 
Huzzz,小猪,你们可真精通,兄弟佩服,不过我总觉得遗憾的是公司不买正版开发工具,
都得要我们自己去下载,要是买了正版得到技术支持就好了。可以省很多事。谢谢你们!
 
我想Delphi6/Kylix2应该都是一样的吧,我这就试试看其源代码。希望能够成功。
 
不对了,Visibroker for Kylix2那段Execute代码已经是修正过的了。说明BORLAND已经在新
版本中改了的。这下死了,不知道是不是有新的问题。不过for Delphi6的代码没有改过,会不会
是因为客户端的参数传入参数没有释放也会影响服务器端,只有测试过了才知道。
 
当客户端调用Visibroker for kylix2的服务器端方法时,这时服务器执行方法会耗费
一定的内存,具体的值是多少,我算了一下,估计是在1K左右,因为我一开始是采用函数
体中传出数据的方法,接下来我全改用返回数据的方法。但这样的话我需要多调用N次服务
器的函数,我发现内存的上升变得更多了。而且在服务器的函数体内,我没有做任何的处
理,就是简单地返回给定数据,如字符串,数值等。这样的情况下,内存上升得越来越多,
而且始终无法释放掉。这里面问题就大了。所以我现在无法采用Visibroker for kylix2了
,版本好象是4.5。真是郁闷。
 
深表同情,去BORLAND的网站上看看有没类似的问题解答,说不定有发现。
 
发现什么? 继续讨论! 这个问题没完
 
后退
顶部