大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、关闭没必要的常驻内存软件——大多数人习惯开启一些安全管理软件,诸如360、LBE、金山,并且把他们的来电拦截、短信拦截、黑名单拦截功能全部开启,这样的确能起到一定安全性,但是对于手机配置不高的朋友来说,这个功能只会使得RAM内存被长时间占用,同时又耗电量。
创新互联-专业网站定制、快速模板网站建设、高性价比宣城网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式宣城网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖宣城地区。费用合理售后完善,10年实体公司更值得信赖。
2、关闭手机省电管理软件——绝大多数字习惯在手机软件上安装省电管家之类的软件,其实,和上面提到的拦截软件相比较,这个软件可以说完全是多余的。首先,一般的手机系统设置里面完全有基本的电量显示、省电管理的功能可以取代这个。其次这个软件本身而言就在吃着你手机的电量、内存。真正的手机发烧友不是安装一大堆软件,而是懂得发觉系统、软件的最大性能。
3、用手机系统流量监控代替第三方软件的监控——这里和上面同理,第三方软件的使用的确揉合各种功能,但你做出的牺牲时你的RAM内存。绕这么多,其实就是要告诉你,手机系统的原生功能远可以代替占用资源的第三方软件帮你实现系统管理。当然,自动的系统管理在美化上面是逊了点。
4、精简、卸载手机系统自动软件——前提是你必须获得手机ROOT,一般玩机的朋友可以在获得后对系统做出更近一步的优化。
安卓手机内存经常不够用的解决方法一:
1、存储内存的清理:
由于软件会缓存很多文件占用内存,卸载后的残留文件我们可以用一款叫做“猎豹清理大师”(原金山清理大师)的软件对垃圾文件进行清理。
2、运行内存的清理:
可以长按Home键,调出近期任务列表,关闭不需要的程序,释放一定的`内存空间。
在内存严重不足的情况下,可以尝试破解系统最高权限,卸载不需要的内置软件。
3、一般内存手机运行内存低于1G就会出现明显的卡顿,所以选购手机最好挑选2G以上的手机。
其次:
手机内存空间所剩不多,需要做以下操作:
1、清理垃圾。用垃圾清理软件,清理一下手机的垃圾。推荐猎豹清理大师、LBE安全大师、SD女佣等。
2、移走相册。一般,手机中最大的空间占用处是相册,长时间拍照和拍摄视频,会占用大量的空间。需要把这些照片和视频移到电脑里或移到云盘里,以节省空间。
3、压缩相片。很多软件都有压缩相片的功能。比如猎豹清理大师、360等。可以在画质没有明显变化的前提下,把照片进行再一次压缩,占用空间至少节省一半。
4、删除系统内无用的软件。这个需要root后,然后删除。最好删除游戏和运营商增值应用,不要删不了解的系统程序。
5、把应用移动到SD卡上。在应用管理器里,找到应用,移到SD卡上。
安卓手机内存经常不够用的解决方法二:
1、终止后台不常用软件运行程序
很多人,通常只是在界面关闭软件。对于安卓机来说,这些程序可能还在后台运行,比如优酷等视频网站,如果后台同时开好几个,所占的运行内存RAM可想而知有多少,这时候需要关闭后台运行这些软件,释放RAM内存空间。可以下载应用管家,一键隔离应用,关闭后台程序,彻底释放内存(前提是要root权限)。
2、限制后台一些软件自动启动
有些软件我们安装时,被默认为开机“自动启动”了。“房间”有限,很多软件同时运行,就会出现拥挤,不仅影响手机速度,浪费流量,还会阻止手机软件安装。这样就需要禁止某些不常用软件的自动启动。可以用“应用管家”,隔离功能,隔离冻结应用,应用在不用的情况下,防止其自启,释放内存。
3、默认安装到SD内存扩展卡
这种情况,是针对装有SD内存扩展卡的手机。内存卡虽然可以扩展手机存储内存,但是如果不设置默认存储位置,下载的软件还是会自动安装到手机空间。所以,优先选择存储位置为SD卡,这样软件就会自动安装在扩展卡里运行。
操作:【设置】-【储存】-【手机存储】-【存储位置】-【默认存储位置】-【SD卡】
内容整理自网络。
在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可以带来直接的效果。本文就简单介绍一张图片到底占用多少内存,我们先假设我们有一张图片时** 600 * 800** 的,图片占用空间大小假设是** 100KB**。
图片内存大小跟占用空间大小有什么关系?
占用空间的大小不是图片占用内存的大小,一些初学者可能会误解一下。占用空间是在磁盘上占用的空间,内存大小是加载到内存中占用的内存大小。两个只是单位是一样的,本质不是一个概念。
一张图片到底占用多少内存呢?(ARGB_8888编码)
1. 图片占用内存的计算公式: 图片高度 * 图片宽度 * 一个像素占用的内存大小
2. 所以上面的图片占用内存是:**800 * 600 * 4 byte = 1875KB = 1.83M **
上面的计算公式中,为什么是4byte呢?文章后面有总结哦
图片所在目录对内存的影响?
在Android中,图片的存放目录和手机的屏幕密度影响图片最终的大小,举个例子:
假设我们的图片放到 xhdpi 目录下,那么我们本文中的图片占用的内存大小如下:
屏幕密度为2的设备:800 * 600 * 4byte = 1.83M
屏幕密度为3的设备:800 * 1.5 * 600 * 1.5 * 4byte = 1.83 * 2.25M =** 4.12M**
所以,计算图片占用内存大小的时候,要考虑图片所在的目录跟设备密度,这两个因素其实影响的是图片的高宽,android会对图片进行拉升跟压缩。
总结
1. 图片确实很占用内存,内存优化先考虑图片内存占用;
2. 一定要避免使用大图片,这就是.9图很有用的原因之一;
3. 图片的大小对内存的影响是正比关系;
4. 本文只是简单的告知读者怎么计算图片的内存大小。
大图: 440 * 336 小图: 220 * 168 资源目录: xhdpi
小图的高宽都是大图的1/2--小图是原图的1/4
界面效果:
测试设备: Coolpad 8676-M01 5.1 density=2.0
测试前准备操作: 同一款设备,设置图片前后多次调用gc直到内存短时间内保持稳定不再变化
内存使用情况: 下图依次是 初始内存,大图内存,小图内存
大图占用内存: 11.23 MB - 10.66 MB = 0.57 MB
小图占用内存: 10.81 MB - 10.66 MB = 0.15 MB
大图小图内存关系: 0.15 MB * 4 = 0.60 MB 约等于 0.57 MB (这是统计工具的误差,理论上就是相等的)
同样的方式在另外一台设备小米4c上得到的结果如下:
测试设备: Xiaomi Mi-4c V8.2.1.0.LXKCNDL 5.1.1 density=3.0
大图占用内存: 13.22 MB - 11.95 MB = 1.27 MB
小图占用内存: 12.27 MB - 11.95 MB = 0.32 MB
大图小图内存关系: 0.32 MB * 4 = 1.28 MB 约等于 1.27 MB
结论: 由此可见大图比小图占用更多的内存,图片大小(分辨率)与占用内存成正比关系
备注: 图片在硬盘上占用的磁盘空间大小,与在内存中占用的内存大小完全不一样,不是一个概念,不要混淆
根据上文中图片大小与内存的关系,可以更加深刻的理解Android中.9图片的作用,它不但能减少apk的体积,还能减少图片占用内存。
有些时候我们根本不需要图片,而是自己绘制背景,可以在自定义View的onDraw中绘制背景,当然最方便的还是使用系统的Drawable,绘制部分交给系统去完成。
下面测试图片与Drawable的内存占用对比
原始图片大小: 482 * 482
界面效果:
测试设备: Xiaomi Mi-4c V8.2.1.0.LXKCNDL 5.1.1
测试前准备操作: 同一款设备,设置背景前后多次调用gc直到内存短时间内保持稳定不再变化
内存使用情况: 下图依次是 初始内存,使用图片占用的内存,使用Drawable占用的内存,使用onDraw绘制占用的内存
使用图片占用内存: 13.97 MB - 11.97 MB = 2.00 MB
使用Drawable占用内存: 11.97 MB - 11.97 MB = 0.00 MB (不会是0,有误差,只是很少)
使用onDraw绘制占用内存: 11.98 MB - 11.97 MB = 0.01 MB
结论: 绘制背景,或者使用系统提供Drawable作为背景,会大大减少内存占用
Drawable参考资料:
Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android GradientDrawable(shape标签定义)静态使用和动态使用(圆角,渐变实现)
“让你的图片最小化”一节中描述的方法:使用尽可能小的图,使用.9,自己绘制背景或者使用Drawable来绘制背景
加载大图片时需要对图片进行压缩,使用等比例压缩方法直接在内存中处理图片
这样做要注意的是,图片质量会变差,inSampleSize设置的值越大,图片质量就越差。
有时候我们取得一张图片,也许只是为了获得这个图片的一些信息,比如图片的width、height等信息,不需要显示到界面上,这个时候我们可以不把图片加载到内存中。
由于Android外层是使用java,而底层使用的是C语言为图片对象分配的内存空间。所以我们的外部虽然看起来释放了,但里层却并不一定完全释放了,我们使用完图片后最好再释放掉里层的内存空间。
RGB(ARGB)
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。在Android中还有包含透明度Alpha的颜色模型,即ARGB。
YUV
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
YUV的原理是把亮度与色度分离,研究证明,人眼对亮度的敏感超过色度。利用这个原理,可以把色度信息减少一点,人眼也无法查觉这一点。
主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题
YUV的存储中与RGB格式最大不同在于,RGB格式每个点的数据是连继保存在一起的。即R,G,B是前后不间隔的保存在2-4byte空间中。而YUV的数据中为了节约空间,U,V分量空间会减小。每一个点的Y分量独立保存,但连续几个点的U,V分量是保存在一起的,(反正人眼一般也看不出区别).这几个点合起来称为macro-pixel, 这种存储格式称为Packed格式。另外一种存储格式是把一幅图像中Y,U,V分别用三个独立的数组表示。这种模式称为planar模式。
CMYK
CMYK也称作印刷色彩模式,顾名思义就是用来印刷的。印刷四分色模式是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。四种标准颜色是:
CMYK和RGB相比有一个很大的不同:RGB模式是一种发光的色彩模式,你在一间黑暗的房间内仍然可以看见屏幕上的内容;CMYK是一种依靠反光的色彩模式,我们是怎样阅读报纸的内容呢?是由阳光或灯光照射到报纸上,再反射到我们的眼中,才看到内容。它需要有外界光源,如果你在黑暗房间内是无法阅读报纸的。只要是在印刷品上看到的图像,就是CMYK模式表现的。比如期刊、杂志、报纸、宣传画等,都是印刷出来的,那么就是CMYK模式的了。
CMYK原色与叠加之后的颜色对比
在不考虑透明度的情况下,一个像素点的颜色值在计算机中的表示方法有以下3种:
在Java中,float类型的变量占32位,int类型的变量占32位,short和char类型的变量都在16位,因此可以看出,用浮点数表示法编码一个像素的颜色,内存占用量是96位即12字节;而用24位整数表示法编码,只要一个int类型变量,占用4个字节(高8位空着,低24位用于表示颜色);用16位整数表示法编码,只要一个short类型变量,占2个字节;因此可以看出采用整数表示法编码颜色值,可以大大节省内存,当然,颜色质量也会相对低一些。在Android中获取Bitmap的时候一般也采用整型编码。
回想一下Android的BitmapConfig类中,有ARGB_8888、ARGB_4444、RGB565等常量,现在可以知道它们分别代表了什么含义。同时也可以计算一张图片在内存中可能占用的大小,比如采用ARGB_8888编码载入一张1920 1200的图片,大概就会占用1920 1200*4/1024/1024=8.79MB的内存。
采用低内存占用量的编码方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存;
1920 1200的图片:*
ARGB_8888:1920 1200 4/1024/1024=8.79MB
ARGB_4444,RGB565:1920 1200 2/1024/1024=4.39MB
在Android中,对图片的使用一定要关注,大多数情况下,占用内存多,OOM发生都是因为图片资源使用不当。不要盲目加一个大图到Android项目中,能使用.9进来使用,而且.9图本身尽可能小,另外能使用绘制实现就不要加一个图片资源。有些时候,在不影响用户体验的情况下,可以降低图片素材质量,比如不需要透明度的就不要了,有些透明度用肉眼看不出来。
部分内容出至林学森的Android内核设计思想。
Android官网内存管理
部分出至
Android本质是Linux所以先从Linux说起。
Linux的内存管理为系统中所有的task提供可靠的内存分配、释放和保护机制。
核心:
虚拟内存
内存分配与释放
内存保护
将外存储器的部分空间作为内存的扩展,如从硬盘划出4GB大小。
当内存资源不足时,系统按照一定算法自动条形优先级低的数据块,并把他们存储到硬盘中。
后续如果需要用到硬盘中的这些数据块,系统将产生“缺页”指令,然后把他们交换回内存中。
这些都是由操作系统内核自动完成的,对上层应用”完全透明“。
每个进程的逻辑地址和物理地址都不是直接对应的,任何进程都没办法访问到它管辖范围外的内存空间——即刻意产生的内存越界与非法访问,操作系统也会马上阻止并强行关闭程序,从而有力的保障应用程序和操作系统的安全和稳定。
一旦发现系统的可用内存达到临界值,机会按照优先级顺序,匆匆低到高逐步杀掉进程,回收内存。
存储位置:/proc/PID/oom_score
优先级策略:
进程消耗的内存
进程占用的CPU时间
oom_adj(OOM权重)
Android平台运行的前提是可用内存是浪费的内存。它试图在任何时候使用所有可用的内存。例如,系统会在APP关闭后将其保存在内存中,以便用户可以快速切换回它们。出于这个原因,Android设备通常运行时只有很少的空闲内存。在重要系统进程和许多用户应用程序之间正确分配内存内对存管理是至关重要。
Android有两种主要的机制来处理低内存的情况:内核交换守护进程(kernel swap daemon)和低内存杀手(low-memory killer)。
当用户在APP之间切换时,Android会在最近使用的(LRU)缓存中保留不在前台的APP,即用户看不到的APP,或运行类似音乐播放的前台服务。如果用户稍后返回APP,系统将重用该进程,从而使APP切换更快。
如果你的APP有一个缓存进程,并且它保留了当前不需要的内存,那么即使用户不使用它,你的APP也会影响系统的整体性能。由于系统内存不足,它会从最近使用最少的进程开始杀死LRU缓存中的进程。该系统还负责处理占用最多内存的进程,并可以终止这些进程以释放RAM。
当系统开始终止LRU缓存中的进程时,它主要是自底向上工作的。系统还考虑哪些进程消耗更多的内存,从而在终止时为系统提供更多的内存增益。你在LRU列表中消耗的内存越少,你就越有可能留在列表中并能够快速恢复。
为了满足RAM的所有需求,Android尝试共享RAM来跨进程通信。它可以做到以下方式:
Android设备包含三种不同类型的内存:RAM、zRAM和storage。
注意:CPU和GPU都访问同一个RAM。
内存被拆分成页。通常每页有4KB的内存。
页面被认为是空闲的或已使用的。
空闲页是未使用的RAM。
已使用页是系统正在积极使用的RAM,分为以下类别:
干净的页面(Clean pages)包含一个文件(或文件的一部分)的一份精确副本存在存储器上。当一个干净的页面不再包含一个精确的文件副本(例如,来自应用程序操作的结果)时,它就变成了脏页。可以删除干净的页,因为它们始终可以使用存储中的数据重新生成;不能删除脏页(Dirty pages),否则数据将丢失。
内核跟踪系统中的所有内存页。
当确定一个应用程序正在使用多少内存时,系统必须考虑shared pages。APP访问相同的服务或库将可能共享内存页。例如,Google Play Services 和一个游戏APP可能共享一个位置服务。这使得很难确定有多少内存属于这个服务相对于每个APP。
当操作系统想要知道所有进程使用了多少内存时,PSS非常有用,因为页面不会被多次计数。PSS需要很长时间来计算,因为系统需要确定哪些页面是共享的,以及被有多少进程。RSS不区分共享页面和非共享页面(使计算速度更快),更适合于跟踪内存分配的更改。
内核交换守护进程(kswapd)是Linux内核的一部分,它将使用过的内存转换为空闲内存。当设备上的空闲内存不足时,守护进程将变为活动状态。Linux内核保持低和高的可用内存阈值。当空闲内存低于低阈值时,kswapd开始回收内存。当空闲内存达到高阈值,kswapd将停止回收内存。
kswapd可以通过删除干净的页面来回收干净的页面,因为它们有存储器支持并且没有被修改。如果进程试图寻址已删除的干净页,则系统会将该页从存储器复制到RAM。此操作称为请求分页。
kswapd将缓存的私有脏页(private dirty pages)和匿名脏页(anonymous dirty pages)移动到zRAM进行压缩。这样做可以释放RAM中的可用内存(空闲页)。如果进程试图触摸zRAM中脏页,则该页将被解压缩并移回RAM。如果与压缩页关联的进程被终止,则该页将从zRAM中删除。
如果可用内存量低于某个阈值,系统将开始终止进程。
lmkd实现源码要在system/core/lmkd/lmkd.c。
lmkd会创建名为lmkd的socket,节点位于/dev/socket/lmkd,该socket用于跟上层framework交互。
小结:
LMK_TARGET: AMS.updateConfiguration() 的过程中调用 updateOomLevels() 方法, 分别向/sys/module/lowmemorykiller/parameters目录下的minfree和adj节点写入相应信息;
LMK_PROCPRIO: AMS.applyOomAdjLocked() 的过程中调用 setOomAdj() 向/proc/pid/oom_score_adj写入oom_score_adj后直接返回;
LMK_PROCREMOVE: AMS.handleAppDiedLocked 或者 AMS.cleanUpApplicationRecordLocked() 的过程,调用remove(),目前不做任何事,直接返回;
为了进一步帮助平衡系统内存并避免终止APP进程,可以Activity类中实现ComponentCallbacks2接口。提供的onTrimMemory()回调方法允许APP在前台或后台侦听与内存相关的事件,然后释放对象以响应应用程序生命周期或表明系统需要回收内存的系统事件。
onTrimMemory()回调是在Android 4.0(API级别14)中添加的。
对于早期版本,可以使用onLowMemory(),它大致相当于TRIM_MEMORY_COMPLETE事件。
一个专门的驱动。(Linux Kernel 4.12 已移除交给kswapd处理)。
很多时候,kswapd无法为系统释放足够的内存。在这种情况下,系统使用onTrimMemory()通知APP内存不足,应该减少其分配。如果这还不够,内核将开始终止进程以释放内存,它使用低内存杀手(LMK)来完成这个任务。
为了决定要终止哪个进程,LMK使用一个名为oom_adj_score的“out of memory”分数来确定运行进程的优先级,高分的进程首先被终止。
后台应用程序首先被终止,系统进程最后被终止。
下表列出了从高到低的LMK评分类别。第一排得分最高的项目将首先被杀死:
Android Runtime(ART)和Dalvik虚拟机使用分页(Paging)和内存映射(mmapping)来管理内存。应用程序通过分配新对象或触摸已映射页面来修改内存都将保留在RAM中,并且不能被调出。应用程序释放内存的唯一方式是垃圾收集器。