大夢想家

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


                  希望大家再次賜教!

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

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

          評論

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

            回復  更多評論    

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

          還有一點,盡量用局部變量,少用成員變量,更不要把大量變量做為參數傳來傳去。
            回復  更多評論    

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

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

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

          其實SWT底層就是JNI實現的,那么請問您是如何處理JNI占有大量內存的問題的?
            回復  更多評論    

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

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

          我感覺應該是代碼的問題,而非SWT的問題,因為我的項目中有30萬行,近百個插件,加上WTP平臺都沒有這個問題。
            回復  更多評論    

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

          如果你使用了圖片,麻煩先在LabelProvider中的getImage返回null,看一下是不是因為圖片資源的問題
            回復  更多評論    

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

          是不是字體,顏色,圖片對資源都有較大影響?
            回復  更多評論    

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

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

          你上一篇中提到任務管理器顯示占用增加,我覺得并不是程序在占用,而是虛擬機根據你程序使用內存的趨勢不斷要求系統提供更大的內存以保證程序的運行。

          還有swt占用的系統資源不會由jvm管理,所以你對swt資源的釋放對jvm內存占用沒有影響。
            回復  更多評論    

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

          恩,你的觀點,我同意,JVM應該就是在幫我增加內存,以防止我再次使用更大的數據時,出現內存溢出~
            回復  更多評論    

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

          看來,我得想辦法減少大數據量的出現了~我的數據,每次都是上萬的,而且是一次讀取的,這個就是很可怕的~
            回復  更多評論    

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

          如果你的記錄都是小的記錄
          一條不超過1K,應該也不是這個問題
          一萬條也才10M
          我想應該還是有數據沒有正確釋放
          比如上一次取得的數據還被某個static變量持有
            回復  更多評論    

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

          System.gc() 并不能按照你的意愿馬上回收無效對象,因為激發垃圾回收操作是有條件的,這個條件不是你來決定的,而是虛擬機以它自己的算法來計算的,函數的調用起的作用好像不大。

          如果是swt的話,對象要銷毀與否,分為兩種吧。一種是從系統里調出來的,比如System.get...,這樣的對象是不需要你來銷毀的,如果是你new出來的,那么你就要負責銷毀它,這在于swt上特別重要,java的垃圾回收也不會幫你自動回收好像哦,因為它涉及到jni的內容,不是虛擬機能管的吧。

          在swt對象中,最好每個對象都配一個dispost方法,在父容器里管理子對象,父容器被dispost時自動調用子對象的dispost方法。

          我在使用使用swt時,管理資源還是比較麻煩的,還得好好研究。
            回復  更多評論    
          主站蜘蛛池模板: 永清县| 德惠市| 兴仁县| 宜良县| 霍山县| 黔江区| 安乡县| 响水县| 上蔡县| 金坛市| 齐齐哈尔市| 阜城县| 五峰| 台湾省| 城口县| 洞头县| 普兰店市| 瓮安县| 海宁市| 和静县| 孙吴县| 霍城县| 武冈市| 福建省| 永德县| 韩城市| 漳平市| 广昌县| 宜川县| 平安县| 吉安市| 鄂伦春自治旗| 兴义市| 峨眉山市| 华池县| 祁东县| 海宁市| 邢台县| 凤凰县| 调兵山市| 吉木萨尔县|