来源:http://blog.csdn.net/hknock/article/details/47322005
转自:http://androidperformance.com/
http://developer.android.com/intl/zh-cn/training/displaying-bitmaps/index.html
为了使垃圾回收器可以正常释放程序所占用的内存,在编写代码的时候就一定要注意尽量避免出现内存泄漏的情况(通常都是由于全局成员变量持有对象引用所导致的),并且在适当的时候去释放对象引用。对于大多数的应用程序而言,后面其它的事情就可以都交给垃圾回收器去完成了,如果一个对象的引用不再被其它对象所持有,那么系统就会将这个对象所分配的内存进行回收。
+
正文
+
How Your App Should Manage Memory 部分。是Android官方帮助应用开发者更好地管理应用的内存而写的。作为一个应用程序开发者,你需要在你开发应用程序的时时刻刻都考虑内存问题。
1. 节制地使用Service
+
+
+
+
2. 当界面不可见时释放内存
+
那么我们如何才能知道程序界面是不是已经不可见了呢?其实很简单,只需要在Activity中重写onTrimMemory()方法,然后在这个方法中监听TRIM_MEMORY_UI_HIDDEN这个级别,一旦触发了之后就说明用户已经离开了我们的程序,那么此时就可以进行资源释放操作了,如下所示:
+
<span class="ds-thread-count" id="comment9" style="display: block; position: absolute; line-height: 16px; font-size: 14px; left: 710px; text-align: center; width: 20px; height: 17px; color: white; background-color: rgb(187, 187, 187); background-position: initial initial; background-repeat: initial initial;">+</span><div class="inline-comment" style="width: 350px; position: absolute; left: 750px;"></div><span class="line">1</span> <span class="line">2</span> <span class="line">3</span> <span class="line">4</span> <span class="line">5</span> <span class="line">6</span> <span class="line">7</span> <span class="line">8</span> <span class="line">9</span> | <span class="ds-thread-count" id="comment10" style="display: block; position: absolute; line-height: 16px; font-size: 14px; left: 710px; text-align: center; width: 20px; height: 17px; color: white; background-color: rgb(187, 187, 187); background-position: initial initial; background-repeat: initial initial;">+</span><div class="inline-comment" style="width: 350px; position: absolute; left: 750px;"></div><span class="line"><span class="annotation">@Override</span> </span> <span class="line"><span class="keyword" style="font-weight: bold;">public</span> <span class="typename">void</span> onTrimMemory(<span class="typename">int</span> level) { </span> <span class="line"> <span class="keyword" style="font-weight: bold;">super</span>.onTrimMemory(level); </span> <span class="line"> <span class="keyword" style="font-weight: bold;">switch</span> (level) { </span> <span class="line"> <span class="keyword" style="font-weight: bold;">case</span> <span class="string" style="color: rgb(221, 17, 68);">TRIM_MEMORY_UI_HIDDEN:</span> </span> <span class="line"> <span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">// 进行资源释放操作 </span></span> <span class="line"> <span class="keyword" style="font-weight: bold;">break</span>; </span> <span class="line"> } </span> <span class="line">}</span> |
+
3.当内存紧张时释放内存
+
3.1 应用程序正在运行时
+
TRIM_MEMORY_RUNNING_LOW 表示应用程序正常运行,并且不会被杀掉。但是目前手机的内存已经非常低了,我们应该去释放掉一些不必要的资源以提升系统的性能,同时这也会直接影响到我们应用程序的性能。
TRIM_MEMORY_RUNNING_CRITICAL 表示应用程序仍然正常运行,但是系统已经根据LRU缓存规则杀掉了大部分缓存的进程了。这个时候我们应当尽可能地去释放任何不必要的资源,不然的话系统可能会继续杀掉所有缓存中的进程,并且开始杀掉一些本来应当保持运行的进程,比如说后台运行的服务。
3.2 应用程序被缓存
+
TRIM_MEMORY_MODERATE 表示手机目前内存已经很低了,并且我们的程序处于LRU缓存列表的中间位置,如果手机内存还得不到进一步释放的话,那么我们的程序就有被系统杀掉的风险了。
TRIM_MEMORY_COMPLETE 表示手机目前内存已经很低了,并且我们的程序处于LRU缓存列表的最边缘位置,系统会最优先考虑杀掉我们的应用程序,在这个时候应当尽可能地把一切可以释放的东西都进行释放。
+
++
注意:当系统安装LRU cache杀进程的时候,尽管大部分时间是从下往上按顺序杀,有时候系统也会将占用内存比较大的进程纳入被杀范围,以尽快得到足够的内存。所以你的应用在LRU list中占用的内存越少,你就越能避免被杀掉,当你恢复的时候也会更快。
4. 检查你应该使用多少的内存
+
+
+
+
5. 避免在Bitmap上浪费内存
+
6. 使用优化过的数据集合
+
7. 知晓内存的开支情况
+
- +
- 使用枚举通常会比使用静态常量要消耗两倍以上的内存,在Android开发当中我们应当尽可能地不使用枚举。
- 任何一个Java类,包括内部类、匿名类,都要占用大概500字节的内存空间。
- 任何一个类的实例要消耗12-16字节的内存开支,因此频繁创建实例也是会一定程序上影响内存的。
- 在使用HashMap时,即使你只设置了一个基本数据类型的键,比如说int,但是也会按照对象的大小来分配内存,大概是32字节,而不是4字节。因此最好的办法就是像上面所说的一样,使用优化过的数据集合。
8. 谨慎使用抽象编程
+
9. 为序列化的数据使用nano protobufs
+
+
10. 尽量避免使用依赖注入框架
+
+
<span class="ds-thread-count" id="comment31" style="display: block; position: absolute; line-height: 16px; font-size: 14px; left: 710px; text-align: center; width: 20px; height: 17px; color: white; background-color: rgb(187, 187, 187); background-position: initial initial; background-repeat: initial initial;">+</span><div class="inline-comment" style="width: 350px; position: absolute; left: 750px;"></div><span class="line">1</span> <span class="line">2</span> <span class="line">3</span> <span class="line">4</span> <span class="line">5</span> <span class="line">6</span> <span class="line">7</span> <span class="line">8</span> <span class="line">9</span> <span class="line">10</span> <span class="line">11</span> <span class="line">12</span> <span class="line">13</span> <span class="line">14</span> <span class="line">15</span> <span class="line">16</span> <span class="line">17</span> <span class="line">18</span> | <span class="ds-thread-count" id="comment32" style="display: block; position: absolute; line-height: 16px; font-size: 14px; left: 710px; text-align: center; width: 20px; height: 17px; color: white; background-color: rgb(187, 187, 187); background-position: initial initial; background-repeat: initial initial;">+</span><div class="inline-comment" style="width: 350px; position: absolute; left: 750px;"></div><span class="line"><span class="component">class AndroidWay <span class="keyword" style="font-weight: bold;">extends</span> Activity { </span> <span class="line"> TextView name; </span> <span class="line"> ImageView thumbnail; </span> <span class="line"> LocationManager loc; </span> <span class="line"> Drawable icon; </span> <span class="line"> String myName; </span> <span class="line"> </span> <span class="line"> public void onCreate(Bundle savedInstanceState) { </span> <span class="line"> super<span class="string" style="color: rgb(221, 17, 68);">.onCreate(savedInstanceState)</span>; </span> <span class="line"> setContentView(R<span class="string" style="color: rgb(221, 17, 68);">.layout.main)</span>; </span> <span class="line"> name = (TextView) findViewById(R<span class="string" style="color: rgb(221, 17, 68);">.id.name)</span>; </span> <span class="line"> thumbnail = (ImageView) findViewById(R<span class="string" style="color: rgb(221, 17, 68);">.id.thumbnail)</span>; </span> <span class="line"> loc = (LocationManager) getSystemService(Activity<span class="string" style="color: rgb(221, 17, 68);">.LOCATION_SERVICE)</span>; </span> <span class="line"> icon = getResources()<span class="string" style="color: rgb(221, 17, 68);">.getDrawable(R.drawable.icon)</span>; </span> <span class="line"> myName = getString(R<span class="string" style="color: rgb(221, 17, 68);">.string.app_name)</span>; </span> <span class="line"> name<span class="string" style="color: rgb(221, 17, 68);">.setText(</span> "Hello, " + myName ); </span> <span class="line"> }</span> </span> <span class="line">}</span> |
+
+
<span class="ds-thread-count" id="comment35" style="display: block; position: absolute; line-height: 16px; font-size: 14px; left: 710px; text-align: center; width: 20px; height: 17px; color: white; background-color: rgb(187, 187, 187); background-position: initial initial; background-repeat: initial initial;">+</span><div class="inline-comment" style="width: 350px; position: absolute; left: 750px;"></div><span class="line">1</span> <span class="line">2</span> <span class="line">3</span> <span class="line">4</span> <span class="line">5</span> <span class="line">6</span> <span class="line">7</span> <span class="line">8</span> <span class="line">9</span> <span class="line">10</span> <span class="line">11</span> <span class="line">12</span> <span class="line">13</span> | <span class="ds-thread-count" id="comment36" style="display: block; position: absolute; line-height: 16px; font-size: 14px; left: 710px; text-align: center; width: 20px; height: 17px; color: white; background-color: rgb(187, 187, 187); background-position: initial initial; background-repeat: initial initial;">+</span><div class="inline-comment" style="width: 350px; position: absolute; left: 750px;"></div><span class="line"><span class="annotation">@ContentView</span>(R.layout.main) </span> <span class="line"><span class="class"><span class="keyword" style="font-weight: bold;">class</span> <span class="title" style="color: rgb(153, 0, 0); font-weight: bold;">RoboWay</span> <span class="keyword" style="font-weight: bold;">extends</span> <span class="title" style="color: rgb(153, 0, 0); font-weight: bold;">RoboActivity</span> </span>{ </span> <span class="line"> <span class="annotation">@InjectView</span>(R.id.name) TextView name; </span> <span class="line"> <span class="annotation">@InjectView</span>(R.id.thumbnail) ImageView thumbnail; </span> <span class="line"> <span class="annotation">@InjectResource</span>(R.drawable.icon) Drawable icon; </span> <span class="line"> <span class="annotation">@InjectResource</span>(R.string.app_name) String myName; </span> <span class="line"> <span class="annotation">@Inject</span> LocationManager loc; </span> <span class="line"> </span> <span class="line"> <span class="function"><span class="keyword" style="font-weight: bold;">public</span> <span class="keyword" style="font-weight: bold;">void</span> <span class="title" style="color: rgb(153, 0, 0); font-weight: bold;">onCreate</span><span class="params">(Bundle savedInstanceState)</span> </span>{ </span> <span class="line"> <span class="keyword" style="font-weight: bold;">super</span>.onCreate(savedInstanceState); </span> <span class="line"> name.setText( <span class="string" style="color: rgb(221, 17, 68);">"Hello, "</span> + myName ); </span> <span class="line"> } </span> <span class="line">}</span> |
+
11. 谨慎使用external libraries
+
+
+
12. 优化整体性能
+
+
13. 使用ProGuard来剔除不需要的代码
+
14. 对最终的APK使用zipalign
+
+
15. 分析你的RAM使用情况
+
16. 使用多进程
+
+
+
+
<span class="ds-thread-count" id="comment51" style="display: block; position: absolute; line-height: 16px; font-size: 14px; left: 710px; text-align: center; width: 20px; height: 17px; color: white; background-color: rgb(187, 187, 187); background-position: initial initial; background-repeat: initial initial;">+</span><div class="inline-comment" style="width: 350px; position: absolute; left: 750px;"></div><span class="line">1</span> <span class="line">2</span> | <span class="ds-thread-count" id="comment52" style="display: block; position: absolute; line-height: 16px; font-size: 14px; left: 710px; text-align: center; width: 20px; height: 17px; color: white; background-color: rgb(187, 187, 187); background-position: initial initial; background-repeat: initial initial;">+</span><div class="inline-comment" style="width: 350px; position: absolute; left: 750px;"></div><span class="line"><span class="tag" style="color: rgb(0, 0, 128);"><<span class="title" style="color: rgb(153, 0, 0); font-weight: bold;">service</span> <span class="attribute" style="color: rgb(0, 128, 128);">android:name</span>=<span class="value">".PlaybackService"</span></span> <span class="line"> <span class="attribute" style="color: rgb(0, 128, 128);">android:process</span>=<span class="value">":background"</span> /></span></span> |
+
http://developer.android.com/training/articles/memory.html