主要问题
1,长生命周期对象持有短周期的引用,导致短周期对象不被回收。
2,大量的长周期对象不能回收。
例子和解决
1,大量的数据库或者文件链接
代码显示的关闭就行。
2,静态对象(如hashmap这种集合),里面存大量的短期对象的引用。
Static Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}
这里随便o引用了null,但是并没有解决new的应用。
3,因为修改对象导致hashcode改变,导致remove失败。
public static void main(String[] args)
{
Set<Person> set = new HashSet<Person>();
Person p1 = new Person("唐僧","pwd1",25);
Person p2 = new Person("孙悟空","pwd2",26);
Person p3 = new Person("猪八戒","pwd3",27);
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3 个元素!
p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变
set.remove(p3); //此时remove不掉,造成内存泄漏
set.add(p3); //重新添加,居然添加成功
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4 个元素!
for (Person person : set)
{
System.out.println(person);
}
}
4,调用外部模块
因为调用外部模块,导致被引用的模块一直有引用。
5,单例模式
因为单例模式的生命周期和进程一样。
所以如果单例模式持有对象的引用,这个对象也会一直活着。
正文完