第1部分: Android是如何管理内存的
1, 何为GC
GC 是 garbage collection 的缩写, 垃圾回收的意思. 也可以是 Garbage Collector, 也就是垃圾回收器。
垃圾回收器的职责
垃圾回收器有三大职责:
- 分配内存;
- 确保任何被引用的对象保留在内存中;
- 回收不能通过引用关系找到的对象的内存.
Heap和Stack
简单说下:
- Heap内存是指java运行环境用来分配给对象和JRE类的内存. 是应用的内存空间.
- Stack内存是相对于线程Thread而言的, 它保存线程中方法中短期存在的变量值和对Heap中对象的引用等.
- Stack内存, 顾名思义, 是类Stack方式, 总是后进先出(LIFO)的.
- 我们通常说的GC的针对Heap内存的. 因为Stack内存相当于是随用随销的.
heap&stack
作者:anly_jun
链接:https://www.jianshu.com/p/5db05db4f5ab
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
2、独特的进程管理策略
Android是依据一个名为LRU(last recently used最近使用过的程序)列表,将程序进行排序,并结束最早的进程。
3、限制应用的内存
为了维持多任务的功能环境,Android为每一个app都设置了一个硬性的heap size限制。准确的heap size限制会因为不同设备的不同RAM大小而各有差异。如果你的app已经到了heap的限制大小并且再尝试分配内存的话,会引起OutOfMemoryError
的错误。
在一些情况下,你也许想要查询当前设备的heap size限制大小是多少,然后决定cache的大小。可以通过getMemoryClass()
来查询。这个方法会返回一个整数,表明你的应用的heap size限制是多少Mb(megabates)。
第2部分: 你的应用该如何管理内存
1) 珍惜Services资源
当一个Service已经不再需要的时候还继续保留它,这对Android应用的内存管理来说是最糟糕的错误之一。
为了能够接收到用户离开你的UI时的通知,你需要实现Activtiy类里面的onTrimMemory()、onLowMemory()
回调方法。
@Override
public void onTrimMemory(int level) {
// TODO Auto-generated method stub
Log.d("060_"," onTrimMemory ... level:" + level);
switch (level) {
case TRIM_MEMORY_UI_HIDDEN:
//释放资源
/*编写释放资源代码*/
Log.d("060_"," TRIM_MEMORY_UI_HIDDEN" );
break;
default:
break;
}
super.onTrimMemory(level);
}
@Override
public void onLowMemory() {
//do release operation
}
OnTrimMemory的参数是一个int数值,代表不同的内存状态:
TRIM_MEMORY_COMPLETE:内存不足,并且该进程在后台进程列表最后一个,马上就要被清理
TRIM_MEMORY_MODERATE:内存不足,并且该进程在后台进程列表的中部。
TRIM_MEMORY_BACKGROUND:内存不足,并且该进程是后台进程。
TRIM_MEMORY_UI_HIDDEN:内存不足,并且该进程的UI已经不可见了。
以上4个是4.0增加
TRIM_MEMORY_RUNNING_CRITICAL:内存不足(后台进程不足3个),并且该进程优先级比较高,需要清理内存
TRIM_MEMORY_RUNNING_LOW:内存不足(后台进程不足5个),并且该进程优先级比较高,需要清理内存
TRIM_MEMORY_RUNNING_MODERATE:内存不足(后台进程超过5个),并且该进程优先级比较高,需要清理内存
以上3个是4.1增加