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

          3G 手機開發網

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

          自己寫的內存管理工具類,支持簡單的垃圾回收

          開發J2AVA ME 程序最需要關注的是內存的占用,開發性能高,適配多種機型的軟件不是件容易的事情,我在國慶時間整理下我的開發思路寫了這個類,給大家參考下


          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;

           

           
           /**
            *  內存管理,工具類,主要是用于項目的內存控制,
            *  此類相對重要點,因為涉及到各個方面的內存回收
            *  此類除了提供一些常用的方法進行回收外,還還提供一個自動回收的機制,不過不建議采用,自動回收機制是是當
            *  空閑內存小于指定內存大小時候,釋放內存,回收的時間是5秒回收一次<br/>
            * 創建日期 2007-10-1
            * @author wuhua
            * <p><b>MSN </b> gggeye@hotmail.com
            * <p><b>EMAIL</b> gooogledev@gmail.com </p>
            * <p>網站支持 <a >http://www.3geye.net</a></p>
            * <p>網站論壇 <a >http://www.3geye.net/bbs</a></p>
            * <p>wuhua的博客 <a >http://wuhua.3geye.net</a></p>
            */
          public   class MemoryManager implements Runnable {
             
              /**
               * 釋放內存,當內存小于addtionMemory時候,進行垃圾回收,主動回收
               * @param addtionMemory
               */
              public final static void release(long addtionMemory) {
                  long freeMemory = Runtime.getRuntime().freeMemory();
                  //如果空閑的內存小于指定的內存,則回收
                  if(freeMemory<=addtionMemory){
                      Logger.println("回收前的內存==>" +MemoryManager.freeMemoryKByte());
                      System.gc();
                      Logger.println("回收后的內存==>" +MemoryManager.freeMemoryKByte());
                  }
              }
             
              /**
               * 釋放指定緩存對象
               * @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();
                  }   
              }
             
              /**
               * 得到系統空閑內存,單位是k
               * @return 返回空閑內存的大小
               */
              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;
              /**
               * 自動回收內存機制,此方法,應該在系統第一次調用的時候調用,如果重復調用則會拋出異常
               * @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;
                  }
                 
              }

              /**
               * 實現對內存的自動化管理
               */
              public void run() {
                  //小于12k內存的時候釋放內存
                  release(1200000);
                   
              }

          }


          爬蟲工作室 -- 專業的手機軟件開發工作室
          3G視線 -- 專注手機軟件開發
          posted on 2007-10-05 15:34 3G工作室 閱讀(1242) 評論(5)  編輯  收藏 所屬分類: j2me

          Feedback

          # re: 自己寫的內存管理工具類,支持簡單的垃圾回收 2007-10-05 17:31 BeanSoft
          很不錯, 支持了!  回復  更多評論
            

          # re: 自己寫的內存管理工具類,支持簡單的垃圾回收 2007-10-06 09:19 千里冰封
          呵呵,不錯,不過不一定能釋放得出來  回復  更多評論
            

          # re: 自己寫的內存管理工具類,支持簡單的垃圾回收[未登錄] 2007-10-06 16:26 咖啡
          好像是只是調用,但真正釋放還是考java虛擬機  回復  更多評論
            

          # re: 自己寫的內存管理工具類,支持簡單的垃圾回收 2007-10-07 12:05 爬蟲工作室
          具體可以釋放的我測試過了。在真機器也測試過?;旧现髁鞯臋C器可以做到這點,在對于開發手機軟件很需要這個東西,要不然就一下子就內存溢出  回復  更多評論
            

          # re: 自己寫的內存管理工具類,支持簡單的垃圾回收 2010-01-26 16:17 過河卒
          貌似是完成了內存的判斷與釋放提示.沒看出實際工作中使用的價值?  回復  更多評論
            

          主站蜘蛛池模板: 大足县| 天门市| 石首市| 修武县| 合阳县| 汝阳县| 高雄市| 马山县| 阳城县| 罗山县| 韶山市| 江达县| 衡山县| 保靖县| 崇州市| 高淳县| 禹城市| 光泽县| 嵊州市| 南投市| 罗田县| 遵义市| 民勤县| 嘉禾县| 永宁县| 百色市| 曲靖市| 桂阳县| 永清县| 岳普湖县| 望都县| 云龙县| 松阳县| 阿拉尔市| 三门峡市| 资阳市| 托里县| 玉屏| 清水河县| 玉山县| 黄龙县|