这两天在重构代码,发现有几个map有出现内存泄露的问题。考虑到独立性,通过java 的timetask来实现。
这里要注意的地方就是任务起始时间的获得。
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* 定时清除类 防止内存泄露 每天清除一次 凌晨三点
*
* @author franciscolv
*
*/
public class ScheduleTask extends TimerTask {
private Timer timer = new Timer();
private ZooKeeperController zkcontroller;
private ZKAgentMain zkAgentMain;
public ZKAgentMain getZkAgentMain() {
return zkAgentMain;
}
public void setZkAgentMain(ZKAgentMain zkAgentMain) {
this.zkAgentMain = zkAgentMain;
}
public void start() {
//这里设置为凌晨三点执行
Calendar date = Calendar.getInstance();
date.set(Calendar.HOUR, 15);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
Date time = date.getTime();
timer.scheduleAtFixedRate(this, time, 1000 * 60 * 60 * 24);
}
@Override
public void run() {
//这里做定时任务的处理
}
public void setCalendar(Calendar calendar) {
this.calendar = calendar;
}
public Calendar getCalendar() {
return calendar;
}
}
其实,Map类的缓存最好还是使用linkHashMap或者之类的带有LRU或者FIFO算法的Map来实现。
手写并发LRU Map值得推荐。等哪天有需求了,写一下。