堆内存分析/screenshot/堆内存分析.jpg)
前言
通过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一次,把没用的内存进行回收。
堆内存分析/screenshot/step1_gc.png)
点击”Dump Java Heap”,生成.hprof(hprof文件为特定时间点,Java进程的内存快照)
堆内存分析/screenshot/step2_dump.png)
以下是根据.hprof文件生成的内存分析表,本文主要关注Shallow Size和Retained Size,其他column含义可以参考官方-HPROF Viewer and Analyzer
堆内存分析/screenshot/heap_nothing.png)
Shallow Size和Retained Size
Shallow Size:该对象本身占有内存大小
Retained Size:释放该对象后,节省的内存大小
Dominating Size:管辖的内存大小,大部分情况和Retained一致
堆内存分析/screenshot/shalow_and_retain.png)
因为可以通过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()
}
堆内存分析/screenshot/case1_TestModel.png)
只定义TestModel成员变量的情况下,内存占用1780=初始内存+引用类型(4)。所以在项目发版前,要把一些没有使用到的变量都清理一遍,积少成多,免得造成内存浪费。
- case 2:空对象TestModel+初始化。
public class MainActivity extends AppCompatActivity {
private TestModel mModel = new TestModel();
...onCreate()
}
1022



被折叠的 条评论
为什么被折叠?



