网上查了一下:关于生命周期的话题
如果是类的成员变量,则其声明周期贯穿整个其对象的生命周期,如果是方法内的变量(局部变量),则仅仅在该方法内有效,出了方法体则无效,失去意义;static是修饰静态代码块或者成员变量或者方法的,其方法或者代码块的生命周期横跨整个应用的生命周期。final修饰的变量只是作为一个常量(定义的标准)来用而已,其生命周期同一般变量,当然接口中的变量默认都是final的。
项目中有这么一个成员变量:
private Set<Map<Object,Object>> models = new HashSet<Map<Object,Object>>();
给予其赋值:
for(Map<String,Object> attr : attrList){
Map<Object,Object> model = new HashMap<Object, Object>();
model.put(attr.get("SAVE_TYPE"), attr.get("SAVE_SQL_ID"));
models.add(model);
}
问题来了,models不断的增加,从未被回收,很纳闷
数据如下:
第一次访问:
[{H=283}, {H=60004}, {H=282}, {H=60005}, {H=281}, {H=280}, {H=60051}, {H=60001}, {Z=60018}, {Z=60017}, {Z=60014}, {Z=60013}, {Z=60016}, {Z=60015}, {Z=60012}, {Z=60011}]
第二次访问:
[{H=283}, {H=60004}, {H=282}, {H=60005}, {H=281}, {H=280}, {H=60051}, {H=60001}, {Z=60018}, {Z=60017}, {Z=60014}, {Z=60013}, {Z=60016}, {H=51501}, {Z=60015}, {Z=60012}, {Z=60011}]
第三次访问:
[{H=283}, {H=60004}, {H=282}, {H=60005}, {H=281}, {H=280}, {H=60051}, {H=51101}, {H=60001}, {Z=60018}, {Z=60017}, {Z=60014}, {Z=60013}, {Z=60016}, {H=51501}, {Z=60015}, {Z=60012}, {Z=60011}]
===================
终于解决了,原因是
public static FormatTemplateView getInstance(){
if(null == instance){
synchronized (FormatTemplateView.class) {
if(null == instance)
instance = new FormatTemplateView();
}
}
return instance;
}
getInstance为static,每次都获取统一个实例,我的天那,单例模式不能随便用