操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

支持简单垃圾回收的内存管理工具类

2007-10-30 作者:饶荣庆 网友评论 0 条 点击进入论坛

  开发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);

  }

  }

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 登录邮箱: 密码:
  匿名发表
今日推荐
技术文库(共有 46473 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail