Android 进程/内存管理误区

简介: 【转载自:http://www.cnbeta.com/articles/151415.htm 】感谢Coldwings的投递新闻来源:自写去年自己就弄了一台i5700,主要用来编程时候做试验平台(因为便宜)。


【转载自:http://www.cnbeta.com/articles/151415.htm 】


感谢Coldwings的投递
新闻来源:自写
去年自己就弄了一台i5700,主要用来编程时候做试验平台(因为便宜)。今年6月给自己及父母各买了一台Android手机,自用DHD,老爸用的i9000,老妈用的Thunderbolt。在进行了许多Android系统的了解及编程之后,发现其实无论是论坛上的用户还是家人使用的过程中,对于Android系统,特别是进程管理这一块都有着许多误区。这里不是指责,只是提出自己的看法,希望拍砖的朋友们轻一点。

一个极其意外的习惯——进程全杀、禁止自启动
记得刚刚开始用i5700时,我和很多人有着一个一样的习惯——全杀进程。i5700的ram很小,而我又有一边开着UC一边开着校内一边开着iReader看书的恶习,通过诸如Advanced task killer之类的软件清理进程,看到空闲ram一下子变多的时候容易有一种虚幻的快感。

后来开始做Android程序,特别是了解到Android系统进程管理(特别是后台管理和自动释放优先级低的进程换取空闲ram)后,才开始明白,当一个程序放到后台时,系统可能将数据保存起来而让程序进行休眠,或者仅仅运行部分服务,仅仅当收到相关的申请时才恢复部分进程,处理完之后结束进程而保留服务——这些都是自动处理的,也就是说,如果用户运行的软件都是按照Android思想而设计的,那么除了明确有退出按键的一部分大型程序外,其他程序是都可以运行后扔到后台不用再管了的,当某个程序需要更多ram时,系统会自动释放掉一些不重要且最近没有使用的程序;而当你打开某个曾经打开的程序时,系统会先检查ram里是不是有这个程序的部分进程,然后进行恢复,这样可以更快打开它。

当然了,如果手机本身ram很小而且cpu不给力,系统自然会很频繁的终止进程释放内存,这就使得许多小内存的手机用起来感觉一卡一卡的了。于是很多论坛都开始讨论怎么样使得全杀过后空闲内存更大、怎样禁止自动启动某些进程——结果空闲ram确实大了,用起来反而更卡了——随便切换个程序(如看书的时候来了个电话)系统都要重新启动几乎所有相关的进程,怎么能反应不迟钝。

Android用RAM的方式,跟windows、WM、Sybiam是两回事。在Android里,RAM被用满了是件好事。它意味着你可以快速打开之前打开的软件,回到之前的位置。所以Android很有效的使用RAM,很多用户看到他们的RAM满了,就认为拖慢了他们的手机。而实际上,退出后重启这些程序才真正拖慢了手机的响应。而且这些自动杀进程的软件本身是个时刻活跃的进程,它始终在后台保持活跃使得CPU难以消停,反而增加了耗电量。

这个问题最终我觉得应该埋怨程序员。许多国内的Android程序员编写的程序根本就没有对进程进行分类,总是试图将所有进程都保留在内存里(例如某著名手机浏览器)!这就使得这些程序即使放到后台了,它也不许系统对其进程进行释放。WM、Sybiam系统里的内存管理没有这么智能,于是习惯了这种方法的程序员以及用户就把这种内存管理方式和使用习惯用到了Android上。所以这里建议,对于很多国内软件(一般都至少还是会有个退出按钮的),用完之后还是按一下退出吧,而对于规范化的程序,以及系统自带的那些程序(例如google的程序基本都没有退出),用过之后放后台就好。

有意思的一个例子——老爸和老妈

我的老爸是个准geek,i9000到手没多久就开始了无尽的刷机和优化之旅。各种论坛上充满了各种关于“优化”和“增加空闲内存”的帖子,他很听从的装了自动杀进程的软件,删了很多会自动启动的google程序(地图、gmail之类之类的),可是还会一个劲问我的DHD空闲内存有多少,为什么会比他的手机空闲内存跟我差不多但是我的会更流畅。

而我的母亲对于手机之类的完全不怎么了解,Thunderbolt在她手里更像是有电话功能的游戏机,如果一个程序没有明显的退出按钮,那她就完全不会退出,更不用说什么禁止自动启动什么自动杀进程之类的东西了。于是当我爸发现老妈手机只有不到30mb的空闲ram可还是比他的i9000顺畅,甚至此时还刚打开切水果开玩的时候,他终究相信了——我妈比他更会用Android手机。

在我向他详细说明为什么可以把程序扔到后台,为什么不应该用那些乱七八糟的进程管理软件之后,他试了三天,然后总算承认——他之前那些所谓优化,全是瞎折腾……

相关文章
|
27天前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
28天前
|
Java 测试技术 Android开发
Android性能测试——发现和定位内存泄露和卡顿
本文详细介绍了Android应用性能测试中的内存泄漏与卡顿问题及其解决方案。首先,文章描述了使用MAT工具定位内存泄漏的具体步骤,并通过实例展示了如何分析Histogram图表和Dominator Tree。接着,针对卡顿问题,文章探讨了其产生原因,并提供了多种测试方法,包括GPU呈现模式分析、FPS Meter软件测试、绘制圆点计数法及Android Studio自带的GPU监控功能。最后,文章给出了排查卡顿问题的四个方向,帮助开发者优化应用性能。
90 4
Android性能测试——发现和定位内存泄露和卡顿
|
25天前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
32 1
|
28天前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
145 4
|
1月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
1月前
|
Linux Windows
检测进程内存的活跃程度
检测进程内存的活跃程度
|
2月前
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
48 1
|
27天前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
51 0
|
2月前
|
Android开发 开发者 Kotlin
Android 多进程情况下判断应用是否处于前台或者后台
本文介绍在多进程环境下判断Android应用前后台状态的方法。通过`ActivityManager`和服务信息`RunningAppProcessInfo`可有效检测应用状态,优化资源使用。提供Kotlin代码示例,帮助开发者轻松集成。
197 8

相关实验场景

更多