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);
}
}