http://www.3geye.net/bbs/thread-221-1-1.html 原文地址,
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;
/**
* 內(nèi)存管理,工具類,主要是用于項(xiàng)目的內(nèi)存控制,
* 此類相對(duì)重要點(diǎn),因?yàn)樯婕暗礁鱾€(gè)方面的內(nèi)存回收
* 此類除了提供一些常用的方法進(jìn)行回收外,還還提供一個(gè)自動(dòng)回收的機(jī)制,不過不建議采用,自動(dòng)回收機(jī)制是是當(dāng)
* 空閑內(nèi)存小于指定內(nèi)存大小時(shí)候,釋放內(nèi)存,回收的時(shí)間是5秒回收一次<br/>
* 創(chuàng)建日期 2007-10-1
* @author wuhua
* <p><b>MSN </b> gggeye@hotmail.com
* <p><b>EMAIL</b> gooogledev@gmail.com </p>
* <p>網(wǎng)站支持 <a >http://www.3geye.net</a></p>
* <p>網(wǎng)站論壇 <a >http://www.3geye.net/bbs</a></p>
* <p>wuhua的博客 <a >http://wuhua.3geye.net</a></p>
*/
public class MemoryManager implements Runnable {
/**
* 釋放內(nèi)存,當(dāng)內(nèi)存小于addtionMemory時(shí)候,進(jìn)行垃圾回收,主動(dòng)回收
* @param addtionMemory
*/
public final static void release(long addtionMemory) {
long freeMemory = Runtime.getRuntime().freeMemory();
//如果空閑的內(nèi)存小于指定的內(nèi)存,則回收
if(freeMemory<=addtionMemory){
Logger.println("回收前的內(nèi)存==>" +MemoryManager.freeMemoryKByte());
System.gc();
Logger.println("回收后的內(nèi)存==>" +MemoryManager.freeMemoryKByte());
}
}
/**
* 釋放指定緩存對(duì)象
* @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();
}
}
/**
* 得到系統(tǒng)空閑內(nèi)存,單位是k
* @return 返回空閑內(nèi)存的大小
*/
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;
/**
* 自動(dòng)回收內(nèi)存機(jī)制,此方法,應(yīng)該在系統(tǒng)第一次調(diào)用的時(shí)候調(diào)用,如果重復(fù)調(diào)用則會(huì)拋出異常
* @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;
}
}
/**
* 實(shí)現(xiàn)對(duì)內(nèi)存的自動(dòng)化管理
*/
public void run() {
//小于12k內(nèi)存的時(shí)候釋放內(nèi)存
release(1200000);
}
}
自己寫的內(nèi)存管理工具類,支持簡(jiǎn)單的垃圾回收
開發(fā)J2AVA ME 程序最需要關(guān)注的是內(nèi)存的占用,開發(fā)性能高,適配多種機(jī)型的軟件不是件容易的事情,我在國(guó)慶時(shí)間整理下我的開發(fā)思路寫了這個(gè)類,給大家參考下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;
/**
* 內(nèi)存管理,工具類,主要是用于項(xiàng)目的內(nèi)存控制,
* 此類相對(duì)重要點(diǎn),因?yàn)樯婕暗礁鱾€(gè)方面的內(nèi)存回收
* 此類除了提供一些常用的方法進(jìn)行回收外,還還提供一個(gè)自動(dòng)回收的機(jī)制,不過不建議采用,自動(dòng)回收機(jī)制是是當(dāng)
* 空閑內(nèi)存小于指定內(nèi)存大小時(shí)候,釋放內(nèi)存,回收的時(shí)間是5秒回收一次<br/>
* 創(chuàng)建日期 2007-10-1
* @author wuhua
* <p><b>MSN </b> gggeye@hotmail.com
* <p><b>EMAIL</b> gooogledev@gmail.com </p>
* <p>網(wǎng)站支持 <a >http://www.3geye.net</a></p>
* <p>網(wǎng)站論壇 <a >http://www.3geye.net/bbs</a></p>
* <p>wuhua的博客 <a >http://wuhua.3geye.net</a></p>
*/
public class MemoryManager implements Runnable {
/**
* 釋放內(nèi)存,當(dāng)內(nèi)存小于addtionMemory時(shí)候,進(jìn)行垃圾回收,主動(dòng)回收
* @param addtionMemory
*/
public final static void release(long addtionMemory) {
long freeMemory = Runtime.getRuntime().freeMemory();
//如果空閑的內(nèi)存小于指定的內(nèi)存,則回收
if(freeMemory<=addtionMemory){
Logger.println("回收前的內(nèi)存==>" +MemoryManager.freeMemoryKByte());
System.gc();
Logger.println("回收后的內(nèi)存==>" +MemoryManager.freeMemoryKByte());
}
}
/**
* 釋放指定緩存對(duì)象
* @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();
}
}
/**
* 得到系統(tǒng)空閑內(nèi)存,單位是k
* @return 返回空閑內(nèi)存的大小
*/
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;
/**
* 自動(dòng)回收內(nèi)存機(jī)制,此方法,應(yīng)該在系統(tǒng)第一次調(diào)用的時(shí)候調(diào)用,如果重復(fù)調(diào)用則會(huì)拋出異常
* @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;
}
}
/**
* 實(shí)現(xiàn)對(duì)內(nèi)存的自動(dòng)化管理
*/
public void run() {
//小于12k內(nèi)存的時(shí)候釋放內(nèi)存
release(1200000);
}
}