大夢(mèng)想家

          5年開發(fā)工程師,2年實(shí)施經(jīng)理,X年售前顧問,......
          數(shù)據(jù)加載中……
          再次尋求從事過Java桌面的應(yīng)用的朋友解惑~
                 今天早上的Blog大家都看到了,大家的留言我也一一拜讀過了~感謝 zhrb ,千里冰封 javazhai ,BeanSoft ,plankton13 ,mingj 等的回復(fù)。
                  下午反省了一下自己的代碼,得出一下結(jié)論和疑問,有時(shí)間,請(qǐng)大家再討論一下。
                  1.反省代碼,整理所有用過的對(duì)象,特別上查詢完數(shù)據(jù)庫返回的上萬條記錄的結(jié)果集,一一將他們制空,然后再System.gc()看看效果;
                  2.因?yàn)槭峭ㄓ脭?shù)據(jù)查詢平臺(tái),那么結(jié)果集的展示形式是可以由實(shí)施人員自由定義的,比方說字體,顏色,圖片等等,雖然我沒有使用JFace對(duì)資源封裝的統(tǒng)一標(biāo)準(zhǔn)組件,但是絕對(duì)是在使用完一一做了銷毀處理,我的疑問是,我對(duì)資源做了銷毀處理,是不是這部分資源在虛擬機(jī)中的占用空間依舊存在,也就是并沒有真正的銷毀他們;
                          這里談?wù)勛约旱膶?shí)踐經(jīng)驗(yàn),如果真的是資源的問題,首先出問題的還輪不到Javaw,Eclipse馬上就會(huì)出來叫囂,告訴你沒有足夠的資源的可以使用,不能創(chuàng)建GC,字體,顏色或者是圖片等等,如果還是不解決,客戶端的GUI馬上就會(huì)變形,變的面目全非~
                  3.我現(xiàn)在碰到的問題還不是內(nèi)存不足,或者內(nèi)存溢出,而是Javaw的內(nèi)存占有再不斷的遞增,并不是某一個(gè)恒定值區(qū)間;


                  希望大家再次賜教!

          客戶虐我千百遍,我待客戶如初戀!

          posted on 2007-10-21 20:34 阿南 閱讀(1376) 評(píng)論(12)  編輯  收藏 所屬分類: Eclipse-RCP

          評(píng)論

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-21 21:47 mingj

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-22 01:34 千里冰封

          還有一點(diǎn),盡量用局部變量,少用成員變量,更不要把大量變量做為參數(shù)傳來傳去。

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~ [未登錄] 2007-10-22 09:50 wzjin

          如果你使用非java代碼,如jni,在操作系統(tǒng)管理器看到的和JProfiler看到的不一樣,前者可能內(nèi)存占用一致增加,后這顯示內(nèi)存占用呈鋸齒型,也就是有垃圾回收作用。你可以試試。沒有用過swt,但是用過jni。

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-22 10:14 阿南

          其實(shí)SWT底層就是JNI實(shí)現(xiàn)的,那么請(qǐng)問您是如何處理JNI占有大量內(nèi)存的問題的?

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-22 10:27 豬兒笨笨

          我做RCP比較多,給你以下幾個(gè)建議
          1、打開Windows的任務(wù)管理器,先看一下你的UI句柄的數(shù)量,如果過多,表示有資源沒有釋放
          2、用TPTP之類的工具檢查有無大的內(nèi)存占用
          3、如果是Tree的內(nèi)容太多(可能性不太大),用SWT.VIRTUAL試試。

          我感覺應(yīng)該是代碼的問題,而非SWT的問題,因?yàn)槲业捻?xiàng)目中有30萬行,近百個(gè)插件,加上WTP平臺(tái)都沒有這個(gè)問題。

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-22 10:39 豬兒笨笨

          如果你使用了圖片,麻煩先在LabelProvider中的getImage返回null,看一下是不是因?yàn)閳D片資源的問題

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-22 10:41 阿南

          是不是字體,顏色,圖片對(duì)資源都有較大影響?

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-22 10:43 Matthew Chen

          swt就是jni實(shí)現(xiàn)的,所以它dispose的時(shí)候一定就釋放了系統(tǒng)的資源(除非swt可能有的bug),留下純java的對(duì)象卻是gc管理的,所以你確定dispose了的話問題就還在jvm內(nèi)部,大的數(shù)據(jù)量一般會(huì)有緩沖機(jī)制,說到這里,不知你的程序是否依托于容器了,提供了對(duì)象緩沖池的實(shí)現(xiàn),需要時(shí)獲得對(duì)象,釋放時(shí)直接歸到池中,不作銷毀,而是供下一次類似的請(qǐng)求直接修改并做二次使用,通過動(dòng)態(tài)調(diào)整對(duì)象數(shù)量來適應(yīng)不同需求。(但也可能內(nèi)存占用增加就時(shí)由這部分的不合理使用產(chǎn)生的,看看容器有沒有全局變量的使用,例如session之類的)

          你上一篇中提到任務(wù)管理器顯示占用增加,我覺得并不是程序在占用,而是虛擬機(jī)根據(jù)你程序使用內(nèi)存的趨勢(shì)不斷要求系統(tǒng)提供更大的內(nèi)存以保證程序的運(yùn)行。

          還有swt占用的系統(tǒng)資源不會(huì)由jvm管理,所以你對(duì)swt資源的釋放對(duì)jvm內(nèi)存占用沒有影響。

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-22 10:47 阿南

          恩,你的觀點(diǎn),我同意,JVM應(yīng)該就是在幫我增加內(nèi)存,以防止我再次使用更大的數(shù)據(jù)時(shí),出現(xiàn)內(nèi)存溢出~

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-22 10:57 阿南

          看來,我得想辦法減少大數(shù)據(jù)量的出現(xiàn)了~我的數(shù)據(jù),每次都是上萬的,而且是一次讀取的,這個(gè)就是很可怕的~

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2007-10-22 13:09 豬兒笨笨

          如果你的記錄都是小的記錄
          一條不超過1K,應(yīng)該也不是這個(gè)問題
          一萬條也才10M
          我想應(yīng)該還是有數(shù)據(jù)沒有正確釋放
          比如上一次取得的數(shù)據(jù)還被某個(gè)static變量持有

          # re: 再次尋求從事過Java桌面的應(yīng)用的朋友解惑~  2008-07-06 23:30 三告習(xí)習(xí)

          System.gc() 并不能按照你的意愿馬上回收無效對(duì)象,因?yàn)榧ぐl(fā)垃圾回收操作是有條件的,這個(gè)條件不是你來決定的,而是虛擬機(jī)以它自己的算法來計(jì)算的,函數(shù)的調(diào)用起的作用好像不大。

          如果是swt的話,對(duì)象要銷毀與否,分為兩種吧。一種是從系統(tǒng)里調(diào)出來的,比如System.get...,這樣的對(duì)象是不需要你來銷毀的,如果是你new出來的,那么你就要負(fù)責(zé)銷毀它,這在于swt上特別重要,java的垃圾回收也不會(huì)幫你自動(dòng)回收好像哦,因?yàn)樗婕暗絡(luò)ni的內(nèi)容,不是虛擬機(jī)能管的吧。

          在swt對(duì)象中,最好每個(gè)對(duì)象都配一個(gè)dispost方法,在父容器里管理子對(duì)象,父容器被dispost時(shí)自動(dòng)調(diào)用子對(duì)象的dispost方法。

          我在使用使用swt時(shí),管理資源還是比較麻煩的,還得好好研究。
          主站蜘蛛池模板: 库尔勒市| 洛南县| 互助| 皮山县| 梨树县| 天镇县| 通州区| 额尔古纳市| 望江县| 社会| 台东县| 顺义区| 岳池县| 阿鲁科尔沁旗| 兰西县| 彝良县| 烟台市| 麟游县| 弋阳县| 隆子县| 温州市| 广汉市| 正定县| 安溪县| 沙雅县| 隆林| 乌兰察布市| 文登市| 兴仁县| 山丹县| 东光县| 怀化市| 新野县| 宜章县| 蕲春县| 防城港市| 南岸区| 余干县| 汉沽区| 贵德县| 蓝山县|