Android的内存泄漏的认识 [英] Android memory leaks understanding

查看:109
本文介绍了Android的内存泄漏的认识的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我读了本书,叫有效的Java由Joshua布洛赫并有一张code而导致内存泄漏。

 公共类堆栈{
 私有对象[]元素;
 私人诠释大小= 0;
 私有静态最终诠释DEFAULT_INITIAL_CAPACITY = 16;

公共栈(){
    元素=新的对象[DEFAULT_INITIAL_CAPACITY]
}

公共无效的push(对象E){
    ensureCapacity();
    元素[尺寸++] = E;
}

公共对象POP(){
    如果(大小== 0)
        抛出新的EmptyStackException();
    返回元素[ - 大小]
}

/ **
 *确保空间至少多了一个元素,大致
 *每次阵列需要发展壮大的能力增加一倍。
 * /
私人无效ensureCapacity(){
    如果(elements.length ==大小)
        元素= Arrays.copyOf(元素,2 *大小+ 1);
}
 

}

流行方法应换用

 公共对象弹出(){
    如果(大小== 0)
        抛出新的EmptyStackException();
    对象result =元素[ - 大小]
    元素[大小] = NULL; //淘汰落后基准
    返回结果;
}
 

这是我清楚。可在code(见下图),导致内存泄漏?例如,我旋转屏幕了大量的时间和私人的ArrayList<字符串> mArrayList =新的ArrayList<字符串>(CAPASITY); 每次分配内存

 公共类MainActivity扩展活动实现OnClickListener {

    私有静态最终诠释CAPASITY = 10000;
    私人的ArrayList<字符串> mArrayList =新的ArrayList<字符串>(CAPASITY);

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        //在mArrayList有些工作
    }

    @覆盖
    公共无效的onClick(视图v){
        //在mArrayList有些工作
    }

    @覆盖
    保护无效的onDestroy(){
        super.onDestroy();
        // TODO:mArrayList = null以prevent内存泄漏。是否有必要做吗?
    }

}
 

解决方案
  

// TODO:mArrayList = null以prevent内存泄漏。是否有必要做吗?

没有,活动的对象和它的成员,如 mArrayList 可以被垃圾收集。您的活动code不显示任何东西,将持有的对象引用不必要的长。

I am reading the book called "Effective Java" by Joshua Bloch and there is a piece of code which leads to memory leaks.

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

}

The pop method should be replaced with

public Object pop() {
    if (size == 0)
        throw new EmptyStackException();
    Object result = elements[--size];
    elements[size] = null; // Eliminate obsolete reference
    return result;
} 

It's clear to me. Can the code (see below) lead to memory leaks? E.g., I rotate the screen a lot of times and private ArrayList<String> mArrayList = new ArrayList<String>(CAPASITY); allocates memory each time.

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

}

解决方案

// TODO: mArrayList = null to prevent memory leaks. Is it necessary to do it?

No, the activity object and its members such as mArrayList can be garbage collected. Your activity code does not show anything that would hold object references unnecessarily long.

这篇关于Android的内存泄漏的认识的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆