Android内存泄漏理解

Android内存泄漏理解,android,list,memory-leaks,android-activity,Android,List,Memory Leaks,Android Activity,我正在读一本名为的书,书中有一段代码导致内存泄漏 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Objec

我正在读一本名为的书,书中有一段代码导致内存泄漏

public class Stack {
 private Object[] elements;
 private int size = 0;
 private static final int DEFAULT_INITIAL_CAPACITY = 16;

public Stack() {
    elements = new Object[DEFAULT_INITIAL_CAPACITY];
}

public void push(Object e) {
    ensureCapacity();
    elements[size++] = e;
}

public Object pop() {
    if (size == 0)
        throw new EmptyStackException();
    return elements[--size];
}

/**
 * Ensure space for at least one more element, roughly
 * doubling the capacity each time the array needs to grow.
 */
private void ensureCapacity() {
    if (elements.length == size)
        elements = Arrays.copyOf(elements, 2 * size + 1);
}
}

pop
方法应替换为

public Object pop() {
    if (size == 0)
        throw new EmptyStackException();
    Object result = elements[--size];
    elements[size] = null; // Eliminate obsolete reference
    return result;
} 
我很清楚。代码(见下文)是否会导致内存泄漏?例如,我多次旋转屏幕并
private ArrayList mArrayList=new ArrayList(CAPASITY)每次分配内存

public class MainActivity extends Activity implements OnClickListener {

    private static final int CAPASITY = 10000;
    private ArrayList<String> mArrayList = new ArrayList<String>(CAPASITY);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Some work on mArrayList
    }

    @Override
    public void onClick(View v) {
        // Some work on mArrayList
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // TODO: mArrayList = null to prevent memory leaks. Is it necessary to do it?
    }

}
public类MainActivity扩展活动实现OnClickListener{
专用静态最终内部容量=10000;
private ArrayList mArrayList=新ArrayList(CAPASITY);
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//一些工作在结婚名单上
}
@凌驾
公共void onClick(视图v){
//一些工作在结婚名单上
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
//TODO:mArrayList=null以防止内存泄漏。是否有必要这样做?
}
}
//TODO:mArrayList=null以防止内存泄漏。有必要这样做吗

否,可以对活动对象及其成员(如
mArrayList
)进行垃圾收集。您的活动代码不会显示任何会保留对象引用不必要长的内容

//TODO:mArrayList=null以防止内存泄漏。有必要这样做吗


否,可以对活动对象及其成员(如
mArrayList
)进行垃圾收集。您的活动代码没有显示任何会不必要地长时间保存对象引用的内容。

它以何种方式泄漏?@blackbelt,我编辑了这个问题。例如,每次屏幕旋转后都会分配内存。@RedPlanet,没有内存泄漏,mArrayList将包含对新ArrayList的引用,而不会引用旧ArrayList,因此将对其进行垃圾收集。对不起,你看了第二版了吗?你在莫斯科哪里买的,花了多少钱?@spongebfan,我已经读了几个星期了。有更好的版本吗?我不记得在哪里买的。@RedPlanet,有第一版翻译成俄语,第二版没有。第二版要更新得多(2008年vs 2001年),但我只在一家网店看到了它,售价200美元,交付期21天。它以哪种方式泄漏?@blackbelt,我编辑了这个问题。例如,每次屏幕旋转后都会分配内存。@RedPlanet,没有内存泄漏,mArrayList将包含对新ArrayList的引用,而不会引用旧ArrayList,因此将对其进行垃圾收集。对不起,你看了第二版了吗?你在莫斯科哪里买的,花了多少钱?@spongebfan,我已经读了几个星期了。有更好的版本吗?我不记得在哪里买的。@RedPlanet,有第一版翻译成俄语,第二版没有。第二版要更新得多(2008年vs 2001年),但我只在一家网店看到它,售价200美元,配送期21天。