饒榮慶 -- 您今天UCWEB了嗎?--http://www.ucweb.com

          3G 手機(jī)開(kāi)發(fā)網(wǎng)

             :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
          http://www.3geye.net/bbs/thread-221-1-1.html 原文地址,

          自己寫(xiě)的內(nèi)存管理工具類,支持簡(jiǎn)單的垃圾回收

          開(kāi)發(fā)J2AVA ME 程序最需要關(guān)注的是內(nèi)存的占用,開(kāi)發(fā)性能高,適配多種機(jī)型的軟件不是件容易的事情,我在國(guó)慶時(shí)間整理下我的開(kāi)發(fā)思路寫(xiě)了這個(gè)類,給大家參考下


          package com.gggeye.util;

          import java.util.Hashtable;
          import java.util.Stack;
          import java.util.TimerTask;
          import java.util.Vector;

          import com.gggeye.demo.Logger;

           

           
           /**
            *  內(nèi)存管理,工具類,主要是用于項(xiàng)目的內(nèi)存控制,
            *  此類相對(duì)重要點(diǎn),因?yàn)樯婕暗礁鱾€(gè)方面的內(nèi)存回收
            *  此類除了提供一些常用的方法進(jìn)行回收外,還還提供一個(gè)自動(dòng)回收的機(jī)制,不過(guò)不建議采用,自動(dòng)回收機(jī)制是是當(dāng)
            *  空閑內(nèi)存小于指定內(nèi)存大小時(shí)候,釋放內(nèi)存,回收的時(shí)間是5秒回收一次<br/>
            * 創(chuàng)建日期 2007-10-1
            * @author wuhua
            * <p><b>MSN </b> gggeye@hotmail.com
            * <p><b>EMAIL</b> gooogledev@gmail.com </p>
            * <p>網(wǎng)站支持 <a >http://www.3geye.net</a></p>
            * <p>網(wǎng)站論壇 <a >http://www.3geye.net/bbs</a></p>
            * <p>wuhua的博客 <a >http://wuhua.3geye.net</a></p>
            */
          public   class MemoryManager implements Runnable {
             
              /**
               * 釋放內(nèi)存,當(dāng)內(nèi)存小于addtionMemory時(shí)候,進(jìn)行垃圾回收,主動(dòng)回收
               * @param addtionMemory
               */
              public final static void release(long addtionMemory) {
                  long freeMemory = Runtime.getRuntime().freeMemory();
                  //如果空閑的內(nèi)存小于指定的內(nèi)存,則回收
                  if(freeMemory<=addtionMemory){
                      Logger.println("回收前的內(nèi)存==>" +MemoryManager.freeMemoryKByte());
                      System.gc();
                      Logger.println("回收后的內(nèi)存==>" +MemoryManager.freeMemoryKByte());
                  }
              }
             
              /**
               * 釋放指定緩存對(duì)象
               * @param addtionMemory
               * @param cache
               */
              public final static void release(long addtionMemory, Object cache){
                  release(addtionMemory);
                  if(cache != null){
                      if(cache instanceof java.util.Hashtable){
                          Hashtable i = (Hashtable)cache;
                          i.clear();         
                      }else if(cache instanceof java.util.Vector){
                          Vector i = (Vector)cache;
                          i.removeAllElements();
                      }else if(cache instanceof java.util.Stack){
                          Stack i = (Stack)cache;
                          i.removeAllElements();
                      }        
                      cache = null;
                      System.gc();
                  }   
              }
             
              /**
               * 得到系統(tǒng)空閑內(nèi)存,單位是k
               * @return 返回空閑內(nèi)存的大小
               */
              public final static String freeMemoryKByte(){
                  return freeMemoryByte()/1024 + "k";
              }
             
             
              public final static long  freeMemoryByte(){
                  return Runtime.getRuntime().freeMemory();
              }
             
             
           

              private static MemoryManager instance ;
              private static TimerTask task;
              /**
               * 自動(dòng)回收內(nèi)存機(jī)制,此方法,應(yīng)該在系統(tǒng)第一次調(diào)用的時(shí)候調(diào)用,如果重復(fù)調(diào)用則會(huì)拋出異常
               * @param time
               */
              public static void autoGC(long time) throws java.lang.RuntimeException{
                  if(instance == null){
                      instance  = new MemoryManager();
                      task = TimerTaskManager.getInstace().create(instance, time);
                  }else
                      throw new RuntimeException("GC is starting...");
              }
             
              public static void colse(){
                  if(instance != null) instance = null;
                  if(task != null){
                      task.cancel();
                      task = null;
                  }
                 
              }

              /**
               * 實(shí)現(xiàn)對(duì)內(nèi)存的自動(dòng)化管理
               */
              public void run() {
                  //小于12k內(nèi)存的時(shí)候釋放內(nèi)存
                  release(1200000);
                   
              }

          }


          爬蟲(chóng)工作室 -- 專業(yè)的手機(jī)軟件開(kāi)發(fā)工作室
          3G視線 -- 專注手機(jī)軟件開(kāi)發(fā)
          posted on 2007-10-05 15:34 3G工作室 閱讀(1234) 評(píng)論(5)  編輯  收藏 所屬分類: j2me

          Feedback

          # re: 自己寫(xiě)的內(nèi)存管理工具類,支持簡(jiǎn)單的垃圾回收 2007-10-05 17:31 BeanSoft
          很不錯(cuò), 支持了!  回復(fù)  更多評(píng)論
            

          # re: 自己寫(xiě)的內(nèi)存管理工具類,支持簡(jiǎn)單的垃圾回收 2007-10-06 09:19 千里冰封
          呵呵,不錯(cuò),不過(guò)不一定能釋放得出來(lái)  回復(fù)  更多評(píng)論
            

          # re: 自己寫(xiě)的內(nèi)存管理工具類,支持簡(jiǎn)單的垃圾回收[未登錄](méi) 2007-10-06 16:26 咖啡
          好像是只是調(diào)用,但真正釋放還是考java虛擬機(jī)  回復(fù)  更多評(píng)論
            

          # re: 自己寫(xiě)的內(nèi)存管理工具類,支持簡(jiǎn)單的垃圾回收 2007-10-07 12:05 爬蟲(chóng)工作室
          具體可以釋放的我測(cè)試過(guò)了。在真機(jī)器也測(cè)試過(guò)。基本上主流的機(jī)器可以做到這點(diǎn),在對(duì)于開(kāi)發(fā)手機(jī)軟件很需要這個(gè)東西,要不然就一下子就內(nèi)存溢出  回復(fù)  更多評(píng)論
            

          # re: 自己寫(xiě)的內(nèi)存管理工具類,支持簡(jiǎn)單的垃圾回收 2010-01-26 16:17 過(guò)河卒
          貌似是完成了內(nèi)存的判斷與釋放提示.沒(méi)看出實(shí)際工作中使用的價(jià)值?  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 大余县| 志丹县| 利川市| 海伦市| 陆良县| 沙河市| 苏尼特左旗| 丰顺县| 宁强县| 电白县| 上饶市| 久治县| 湘潭县| 舒兰市| 巴青县| 磐安县| 柞水县| 宁国市| 都安| 阿鲁科尔沁旗| 杭州市| 隆回县| 汕头市| 红原县| 旬邑县| 龙陵县| 泾阳县| 南溪县| 洛川县| 陈巴尔虎旗| 阜城县| 岳西县| 钦州市| 大关县| 宁阳县| 苍梧县| 临城县| 文昌市| 健康| 海南省| 苏尼特右旗|