饶荣庆 -- 您今天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 href="http://www.3geye.net">http://www.3geye.net</a></p>
  * <p>网站论坛 <a href="http://www.3geye.net/bbs">http://www.3geye.net/bbs</a></p>
  * <p>wuhua的博客 <a href="http://wuhua.3geye.net">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工作室 阅读(1228) 评论(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 爬虫工作室
具体可以释放的我测试过了。在真机器也测试过。基本上主流的机器可以做到这点,在对于开发手机软件很需要这个东西,要不然就一下子就内存溢出  回复  更多评论
  

# re: 自己写的内存管理工具类,支持简单的垃圾回收 2010-01-26 16:17 过河卒
貌似是完成了内存的判断与释放提示.没看出实际工作中使用的价值?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: