zoukankan      html  css  js  c++  java
  • 使用 Eclipse Memory Analyzer 进行简单内存泄漏分析

    Java 内存泄露的根本原因: 保存了不可能再被访问的变量类型的引用。因此我们的目的就是要找出这样的引用。

    1.测试代码:

    public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Vector v = new Vector();     
             for (int i = 1; i < 1000000; i++)      { 
                 String str = new String("测试数据"+i);
            v.add(str);      
    //        o = null;      
            }//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。  
        } 
    }

    2.转到DDMS模式

    3.在Devices列表中选中测试app的进程,然后点击

    4.选择Finish

    5.在“Leak Suspects”窗口中可以看到饼图

    颜色越深,表明占用内存越大。然后我们看到“Problem Suspect 1”中有个details,

    6.点开details,得到:

     

     可以看到vector占用了大量内存,而其存在于main thread中。这个例子中没有指出这个对象具体在哪个类中,只说了它在UI线程中,还要我们自己去找它是在主线程中哪个位置。

    PS:下面的例子可以找到内存泄漏的对象是在哪个类中。

    将上面第1步的测试代码换成如下的代码:

    public class MainActivity extends Activity {
    private ArrayList<String> mList = new ArrayList<>();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            for (int i = 0; i < 10000000; i++) {
                String  str= new String("测试字符串"+i);
                mList.add(str);
            }
        }
    }

    重复以上步骤2~5,第6步如下:

    6.点开details,得到如下页面:

    可以看到,对象mList内存占用大,而且也给出了它所在的类“com.example.zhbjn.MainActivity”,是不是很爽。

  • 相关阅读:
    Promise
    replace
    mongogogog
    sh back mongo
    mongodb 备份 还原 导出 导入
    mongo virtual
    openssl
    isMobile
    google api autocomplete
    npm
  • 原文地址:https://www.cnblogs.com/johnsonwei/p/5859749.html
Copyright © 2011-2022 走看看