2004年开始,我开始让研发团队基于Eclipse插件技术开发通用管理软件(最近的一个产品是一体化企业管理软件CRM+OA+DSS+进销存的E-System)
选取RCP方式开发管理软件,我们的初衷是期望使得用户界面的丰富性和易操作,能够充分利用Eclipse本身丰富的SWT/JFACE/GEF/EMF等技术来完美我们的界面表现,应该说这方面Eclipse RCP确实不辜负我们的期望。
在四年的Eclipse RCP开发经历中,经历了很多坎坷和难以逾越的障碍,其中有一个至今仍在困扰着我们的问题就是Eclipse RCP的性能问题,它主要有以下几个方面问题:
1、如何高性能处理服务端与客户端的数据传递?
2、因为我们软件面向的用户是通用市场,用户机器环境良莠不齐(从最新的四核处理器到十年前的P3机都有人使用,内存从256M到2G都有)?如何克服Eclipse RCP对客户端应用的高性能要求(用过老机器使用Eclipse开发的都知道那导出Eclipse RCP漫长等待的滋味,2 hours,真是生不如死呀!)?并能尽量发挥机器的处理能力?
在这方面我尝试了很多方法,可以用于改善这两个问题:
1、选择最合适的数据传递方法,rmi、web-service、hessian、tcp client/server做了下对比,我觉得如何你需要传递的数据如果耦合层次比较低、业务关系简单其实完全可以模拟http方式,用自己的request/response对象进行传递。那rmi/web-service是蛮好的选择。但如果数据之间耦合关系紧密、业务关系复杂(我现在的系统有312个POJO,它们之间都有或紧或密的关系,而视图由于我让客户可以自定义,所以无法在设计阶段确定form view与action对象)这样显然无法使用web-service(web-service只支持最原始的几种数据类型)、而直接将对象序列化进行传递的方法也不可取(因为pojo对象均有关联,直接序列化的对象几乎就是整个数据库的内容,因为form不确定也无法构造对应的action对象来完成传递)。挣扎了很久,最后用了一种折衷的方法,数据传输采传值拷贝序列化方式(但默认只拷贝两层,即引用的对象中只包含原始属性,不再包括它引用的对象/集合属性),在特殊需应用到多层对象级联数据传递时才定制request对象中的约定参数来表明传递层次。传输方式使用自己定制的tcp client/server方式,选用这种方式主要是为了降低数据传输的尺寸(web-service中垃圾太多了),其中细节当然很多(如如何自动为request对象补充未传输数据、服务端hibernate对象如何将POJO代理对象拷贝成值对象...),每个问题都是我们的一个血泪史,嘿....
2、Eclipse对系统硬件的高要求地球人都知道,如何尽量降低它呢?我的原则是尽量不要使用非必要插件,RCP每加载一个插件自然就会多消耗。另外还有一个很重要的方法就是关掉不使用的perspective,NND,当初系统刚出街时,很快就有客户投诉早上打开系统很快,中午就慢如蜗牛了,一顿臭骂呀!当然也不能随用随开,那Eclipse要隋性加载干啥,一样客户臭骂(怎么我每点一次鼠标就要出去抽只烟呀?),没计,只好写个计数器,从客户登录开始就记录各perspective的使用频率,把超出范围(根据客户的内存选择,我认为有闲置256M内存不要超过5个,512M内存可以15个,1G以上就可以不关了)的perspective关掉,保持最高使用率的perspective可以随点随开。
BTW:千万记得要在eclipse rcp中加上运行参数(如果客户内存富裕你也可以在安装程序中调高它,我的程序默值是这样),不然内存被它吃光了,就听客户狂打你们客服电话吧!
-vmargs
-Xverify:none
-XX:+UseParallelGC
-XX:PermSize=20M
-XX:MaxPermSize=128M
-Xms64M
-Xmx128M
Eclipse RCP关于管理软件方法应用的开发资料很少,欢迎同道之人相互交流!
本人原创文章,欢迎转载,转载请注明出处!