标签:
垃圾回收机制
1、什么是垃圾回收机制?
(1)垃圾回收器负责回收程序中已经不再使用,但是仍然被各种对象占用的内存。
(2)无需手动管理内存,android系统会自动跟踪所有的对象,并释放那些不再被使用的对象。
缺点:垃圾回收机制是一把双刃剑,在提高程序员工作效率的同时,会对应用程序的性能造成影响,严重的会是应用程序卡顿等。
峰值后占用内存减少,是系统进行了一次垃圾回收。
系统在垃圾回收时可能会暂停当前程序的执行,这样有可能会导致某一帧的绘制超过了16ms,用户就会感觉卡顿。
一个典型场景就是 内存泄露
内存泄露指的是应用程序在运行时分配了一些的对象,这些对象所占用的内存并不能被垃圾回收程序所回收 一一 导致系统可分配内存越来越少 一一 新对象的创建需要的内存不够 一一 调用垃圾回收程序执行一次垃圾回收 一一 垃圾回收可能会暂停当前程序的执行 一一 可能会导致某一帧的绘制超过16ms,影响到当前的帧率 一一 帧率达不到60fps 一一 用户感到卡顿。
内存检测工具
1、Memory Monitor
2、Allocation Tracker
主要用来追踪应用程序在运行时,所有已创建的对象、对象的数量、占用内存大小、以及这些对象是在哪些方法中被创建出来的信息。
点击图上2处,再次点击Allocation Tracker,AS会打开Allocation Tracker统计结果。
3、Heap Viewer
工具可实时展示应用程序在运行时所有已分配对象的数量、大小、类型等信息。
总结:
1、Memory Monitor
方便显示内存使用和GC情况;
快速定位卡顿是否和GC有关;
快速定位Crash是否和内存占用过高有关;
快速定位潜在的内存泄露问题;
缺点:不能准确定位问题,只能提供大概的方向。2、Allocation Tracker
定位代码中分配的对象的类型、大小、时间、线程、堆栈等信息;
定位内存抖动问题;
配合Heap Viewer一起定位内存泄露问题
缺点:使用复杂。3、Heap Viewer
内存快照信息
每次GC之后收集一次信息
查找内存泄露利器
缺点:使用复杂。
4、LeakCanary
开源库
1、单例造成的内存泄露
静态变量在整个程序的运行期间是一直存在的,不会被垃圾回收;静态变量本身会持有一个activity对象的引用的,activity对象即使被销毁了也不会被垃圾回收,从而造成了内存泄露。
2、非静态内部类的静态实例造成的泄露
TestResource是在MainActivity定义的非静态内部类,
其对象sResource对象会间接的持有MainActivity实例的引用,又把sResource定义为静态变量,所以在程序运行期间sResource对象不会被垃圾回收,并且一直持有MainActivity的引用,导致MainActivity也不会被垃圾回收。
3、Handler造成的内存泄露
创建一个匿名内部类的对象,它会间接持有外部类实例的引用;Handler经常用来做耗时的操作,可能存活时间比MainActivity实例时间长,所以可能会导致MainActivity销毁后并不能被垃圾回收,必须要等Handler被垃圾回收之后,MainActivity对象才会被垃圾回收。
避免内存泄露的方法:
1、尽量不要让静态变量引用Activity;如果要用,尽量使用WeakReference;
2、使用静态内部类来代替内部类(静态内部类不会持有它外部类的引用);
3、静态内部类使用弱引用来引用外部类
减少内存使用
标签:
原文地址:http://blog.csdn.net/sinat_16640839/article/details/51366421