当前位置: 代码迷 >> Android >> 资源回收有关问题
  详细解决方案

资源回收有关问题

热度:103   发布时间:2016-05-01 21:27:38.0
资源回收问题
public class TestingImpl implements Testing {
User user = new User();
public TestingImpl(){
user.setId(33);
user.setName("cat");
}

@Override
public void testFor1() {
}

@Override
public void testFor2() {
recycle(user);
}


private void recycle(Object ...args) {
for (int i = 0, len = args.length; i < len; i++) {
if(args[i] instanceof User)
((User)args[i]).setName("44");
args[i] = null;
}

System.gc();
}

private class User{
private int id;
private String name;

public User(){

}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}


}

}

为什么user没有被回收掉。。。?求解...

------解决方案--------------------
system.gc不是你写了系统就会调用的,这个由虚拟机决定。
------解决方案--------------------
调用System.gc()也仅仅是一个请求。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。
------解决方案--------------------
VM总是会在内存还剩10%~20%左右的时候调用自动GC,所以不会存在垃圾越堆越多.不过如果在内存资源紧缺的时候,加载大的资源还是会出现OOME.我的理解是:即时这个时候调用GC也无济于事.只能从根本上避免在内存到达峰值的时候加载大的资源.
------解决方案--------------------
因为你的User user = new User();这样写的话,你的user要等到程序运行完才会被gc回收,
你应该这么写会好点
User user;
然后在程序里new,即user=new User();
  相关解决方案