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