2004年開始,我開始讓研發(fā)團(tuán)隊(duì)基于Eclipse插件技術(shù)開發(fā)通用管理軟件(最近的一個(gè)產(chǎn)品是一體化企業(yè)管理軟件CRM+OA+DSS+進(jìn)銷存的E-System)
選取RCP方式開發(fā)管理軟件,我們的初衷是期望使得用戶界面的豐富性和易操作,能夠充分利用Eclipse本身豐富的SWT/JFACE/GEF/EMF等技術(shù)來完美我們的界面表現(xiàn),應(yīng)該說這方面Eclipse RCP確實(shí)不辜負(fù)我們的期望。
在四年的Eclipse RCP開發(fā)經(jīng)歷中,經(jīng)歷了很多坎坷和難以逾越的障礙,其中有一個(gè)至今仍在困擾著我們的問題就是Eclipse RCP的性能問題,它主要有以下幾個(gè)方面問題:
1、如何高性能處理服務(wù)端與客戶端的數(shù)據(jù)傳遞?
2、因?yàn)槲覀冘浖嫦虻挠脩羰峭ㄓ檬袌觯脩魴C(jī)器環(huán)境良莠不齊(從最新的四核處理器到十年前的P3機(jī)都有人使用,內(nèi)存從256M到2G都有)?如何克服Eclipse RCP對客戶端應(yīng)用的高性能要求(用過老機(jī)器使用Eclipse開發(fā)的都知道那導(dǎo)出Eclipse RCP漫長等待的滋味,2 hours,真是生不如死呀!)?并能盡量發(fā)揮機(jī)器的處理能力?
在這方面我嘗試了很多方法,可以用于改善這兩個(gè)問題:
1、選擇最合適的數(shù)據(jù)傳遞方法,rmi、web-service、hessian、tcp client/server做了下對比,我覺得如何你需要傳遞的數(shù)據(jù)如果耦合層次比較低、業(yè)務(wù)關(guān)系簡單其實(shí)完全可以模擬http方式,用自己的request/response對象進(jìn)行傳遞。那rmi/web-service是蠻好的選擇。但如果數(shù)據(jù)之間耦合關(guān)系緊密、業(yè)務(wù)關(guān)系復(fù)雜(我現(xiàn)在的系統(tǒng)有312個(gè)POJO,它們之間都有或緊或密的關(guān)系,而視圖由于我讓客戶可以自定義,所以無法在設(shè)計(jì)階段確定form view與action對象)這樣顯然無法使用web-service(web-service只支持最原始的幾種數(shù)據(jù)類型)、而直接將對象序列化進(jìn)行傳遞的方法也不可取(因?yàn)閜ojo對象均有關(guān)聯(lián),直接序列化的對象幾乎就是整個(gè)數(shù)據(jù)庫的內(nèi)容,因?yàn)閒orm不確定也無法構(gòu)造對應(yīng)的action對象來完成傳遞)。掙扎了很久,最后用了一種折衷的方法,數(shù)據(jù)傳輸采傳值拷貝序列化方式(但默認(rèn)只拷貝兩層,即引用的對象中只包含原始屬性,不再包括它引用的對象/集合屬性),在特殊需應(yīng)用到多層對象級(jí)聯(lián)數(shù)據(jù)傳遞時(shí)才定制request對象中的約定參數(shù)來表明傳遞層次。傳輸方式使用自己定制的tcp client/server方式,選用這種方式主要是為了降低數(shù)據(jù)傳輸?shù)某叽纾╳eb-service中垃圾太多了),其中細(xì)節(jié)當(dāng)然很多(如如何自動(dòng)為request對象補(bǔ)充未傳輸數(shù)據(jù)、服務(wù)端hibernate對象如何將POJO代理對象拷貝成值對象...),每個(gè)問題都是我們的一個(gè)血淚史,嘿....
2、Eclipse對系統(tǒng)硬件的高要求地球人都知道,如何盡量降低它呢?我的原則是盡量不要使用非必要插件,RCP每加載一個(gè)插件自然就會(huì)多消耗。另外還有一個(gè)很重要的方法就是關(guān)掉不使用的perspective,NND,當(dāng)初系統(tǒng)剛出街時(shí),很快就有客戶投訴早上打開系統(tǒng)很快,中午就慢如蝸牛了,一頓臭罵呀!當(dāng)然也不能隨用隨開,那Eclipse要隋性加載干啥,一樣客戶臭罵(怎么我每點(diǎn)一次鼠標(biāo)就要出去抽只煙呀?),沒計(jì),只好寫個(gè)計(jì)數(shù)器,從客戶登錄開始就記錄各perspective的使用頻率,把超出范圍(根據(jù)客戶的內(nèi)存選擇,我認(rèn)為有閑置256M內(nèi)存不要超過5個(gè),512M內(nèi)存可以15個(gè),1G以上就可以不關(guān)了)的perspective關(guān)掉,保持最高使用率的perspective可以隨點(diǎn)隨開。
BTW:千萬記得要在eclipse rcp中加上運(yùn)行參數(shù)(如果客戶內(nèi)存富裕你也可以在安裝程序中調(diào)高它,我的程序默值是這樣),不然內(nèi)存被它吃光了,就聽客戶狂打你們客服電話吧!
-vmargs
-Xverify:none
-XX:+UseParallelGC
-XX:PermSize=20M
-XX:MaxPermSize=128M
-Xms64M
-Xmx128M
Eclipse RCP關(guān)于管理軟件方法應(yīng)用的開發(fā)資料很少,歡迎同道之人相互交流!
本人原創(chuàng)文章,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處!