性能优化(一)堆内存分析

前言

通过Android Studio的Memory Monitor工具,对各种数据类型,如:boolean,int,float,long,SparseArray,HashMap等在内存的占用情况进行分析。对一些特定场景下的代码编写,如:String拼接,OnClickListener等所消耗的内存情况进行分析。通过分析,更好的了解了不同情况下堆内存是如何分配的,也确切验证了以往诸多的代码经验,为高效合理的利用内存奠定基础。

Memory Monitor的基本使用

  • 新建MainActivity,启动APP
public class MainActivity extends AppCompatActivity {
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
  • 在 Android Monitor -> Monitors -> Memory 中,点击”initiate GC”,先手动GC一次,把没用的内存进行回收。

  • 点击”Dump Java Heap”,生成.hprof(hprof文件为特定时间点,Java进程的内存快照)

以下是根据.hprof文件生成的内存分析表,本文主要关注Shallow Size和Retained Size,其他column含义可以参考官方-HPROF Viewer and Analyzer

Shallow Size和Retained Size

Shallow Size:该对象本身占有内存大小
Retained Size:释放该对象后,节省的内存大小
Dominating Size:管辖的内存大小,大部分情况和Retained一致

因为可以通过GC Roots直接访问,所以左图的obj3不是蓝色节点;而右图却是蓝色,因为它已经被包含在 Retained size 中。

Shallow Size Retained Size(左) Retained Size(右)
obj1 obj1 obj1+obj2+obj4
obj2 obj2 obj2+obj4

案例分析

如图heap_nothing.png,在MainActivity在新建的时候,初始占用内存1776(以下案例分析基于红米note3机型)。

  • case 1:空对象TestModel+未初始化。
public class TestModel {
   
}

public class MainActivity extends AppCompatActivity {
   
    private TestModel mModel;
    ...onCreate()
}

只定义TestModel成员变量的情况下,内存占用1780=初始内存+引用类型(4)。所以在项目发版前,要把一些没有使用到的变量都清理一遍,积少成多,免得造成内存浪费。

  • case 2:空对象TestModel+初始化。
public class MainActivity extends AppCompatActivity {
   
    private TestModel mModel = new TestModel();
    ...onCreate()
}

你可能感兴趣的:(Android,内存优化,Android)