2013-06-04 127 views
0

我正在阅读名为"Effective Java" by Joshua Bloch的书,并且有一段代码会导致内存泄漏。Android内存泄漏了解

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; 
} 

很显然,我被替换。代码(见下文)是否会导致内存泄漏?例如,我旋转屏幕很多次,并且每次都分配内存。

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? 
    } 

} 
+0

以哪种方式泄漏? – Blackbelt

+0

@blackbelt,我编辑了这个问题。例如,在每个屏幕旋转之后分配内存。 –

+1

@RedPlanet,没有内存泄漏,mArrayList将包含对新ArrayList的引用,并且不会引用旧的,因此它将被垃圾收集。对不起,对于offtopic,你读了第二版吗?你在莫斯科得到了什么,它的成本是多少? – SpongeBobFan

回答

3

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

不,活动对象及其成员如mArrayList可以被垃圾收集。您的活动代码不会显示任何会长时间持有对象引用的内容。