安卓手机内存不足的原因及解决方法是什么

安卓手机内存不足的原因及解决方法是什么,第1张

1、将已经安装过的安卓程序的缓存文件和下载文件都清理掉。

2、卸载掉那些使用频率非常低的应用程序,这样也有利于很多安卓手机内存空间清理。

3、及时清理后台打开过或正在运行的软件,释放RAM空间,可以使用各种清理软件。

安卓系统的一大亮点就在于他对很多您手机端的软件做有内存驻留功能为的是在您使用软件的时候可以直接打开无需等待过长的时间,所以您的内存总是在占用70%是正常的,如果您真的想降低内存占用率的话两种方法。

方法一:使用第三方软件比如内存优化大师。

方法二:刷机获取权限,将没用的进程删掉。

。其实无关紧要,您剩余的30%内存基本上是足够提供您其他的 *** 作了,因为他在实用软件比如打开QQ的时候会调用其他占用内存,保持您手机中始终有30%的空闲内存为的就是手机的运行流畅。

确实是这样,我们都发现即使安卓手机更新换代,换成最新型的内存,扩到最大运行内存也扩大最大,它的运行意思都占掉一半,即使你不开任何应用。这是因为安卓手机它会在后台开着一些系统应用以及一些自启动的应用,这些应用也会耗费你内存的运算容量,所以我们会看到他总是占比这么高。

不管是安卓系统的手机还是iOS系统的手机,我们都无法看到它的运行内存,在开机那一刻是处于0%的这个状态。这是由于我们的手机,它在开机的时候就已经在行使一些功能了,比如说屏幕的亮度保持,以及它屏幕上面显示的一些应用图标,或者他手机上面的一些时钟显示等等后台小程序,你不会注意到的系统程序。虽然它在系统运算当中占比并不如我们能够看到的应用的占比大,但是它们也一定会耗费掉一部分的运算进程,因此无论什么型号的手机,它的运行内存都不可能降到0%。但为什么安卓手机的需要的运行内存那么大呢?而且不管你手机型号,占比几乎永远都是在50%左右。这是由于,虽然随着科技的发达,我们的手机它的运行内存逐渐在扩容,但同时我们手机的应用也发生翻天覆地的变化,这些也是通过手机应用的升级来取得的,既然系统应用都在升级,那么它的运算绝对不会比初级的运算容量少,那么他需要的内存容量自然也要远远大于之前的应用,因此我们就会需要一些大的扩容,而在这些扩容之后的内存,它需要的占比依然是保持在这个水平上的。

还有一点就是安卓手机它后台的运用会比较多,对它保持了开机就启动的应用,会比其他系统的手机要多,这是由于我们本身后台此系统是为了方便唤醒你常用的应用,但因为一些别的原因这些应用会在默认的条件下都保持开启,只有你手动才能把它关闭,假如这些应用的话你不是很常用,那你就会觉得比较卡顿。

内存优化就是对内存问题的一个预防和解决,做内存优化能让应用挂得少、活得好和活得久。

挂的少:

“挂”指的是 Crash,内存问题导致 Crash 的具体表现就是内存溢出异常 OOM。

活得好:

活得好指的是使用流畅,Android 中造成界面卡顿的原因有很多种,其中一种就是由内存问题引起的。内存问题之所以会影响到界面流畅度,是因为垃圾回收(GC,Garbage Collection),在 GC 时,所有线程都要停止,包括主线程,当 GC 和绘制界面的 *** 作同时触发时,绘制的执行就会被搁置,导致掉帧,也就是界面卡顿。

活得久:

活得久指的是我们的应用在后台运行时不会被干掉。Android 会按照特定的机制清理进程,清理进程时优先会考虑清理后台进程。清理进程的机制就是LowMemoryKiller。在 Android 中不同的进程有着不同的优先级,当两个进程的优先级相同时,低杀会优先考虑干掉消耗内存更多的进程。也就是如果我们应用占用的内存比其他应用少,并且处于后台时,我们的应用能在后台活下来,这也是内存优化为我们应用带来竞争力的一个直接体现。

内存占用是否越少越好?

当系统 内存充足 的时候,我们可以多用 一些获得更好的性能。当系统 内存不足 的时候,我们希望可以做到 ”用时分配,及时释放“。内存优化并不能一刀切。

我们都知道,应用程序的内存分配和垃圾回收都是由Android虚拟机完成的,在Android 50以下,使用的是Dalvik虚拟机,50及以上,则使用的是ART虚拟机。

Android虚拟机Dalvik和ART

1、内存区域划分

详细请看以下两篇文章(建议全看):

java内存四大区_JVM内存区域划分

Android 内存机制

2、内存回收

垃圾收集的标记算法(找到垃圾):

垃圾收集算法(回收垃圾):

引用类型:强引用、软引用、弱引用、虚引用

对象的有效性=可达性+引用类型

JAVA垃圾回收机制-史上最容易理解看这一篇就够了

Android:玩转垃圾回收机制与分代回收策略

android中还存在低杀机制,这种情况属于系统整机内存不足,直接把应用进程杀掉的情况。

Android后台杀死系列:LowMemoryKiller原理

1、内存溢出

系统会给每个App分配内存空间也就是heap size值,当app占用的内存加上申请的内存超过这个系统分配的内存限额,最终导致OOM(OutOfMemory)使程序崩溃。

通过命令 getprop |grep dalvikvmheapsize 可以获取系统允许的最大

注意:在设置了heapgrowthlimit的状况下,单个进程可用最大内存为heapgrowthlimit值。在android开发中,若是要使用大堆,须要在manifest中指定android:largeHeap为true,这样dvm heap最大可达heapsize。

关于heapsize & heapgrowthlimit

2、内存泄漏

Android系统虚拟机的垃圾回收是通过虚拟机GC机制来实现的。GC会选择一些还存活的对象作为内存遍历的根节点GC Roots,通过对GC Roots的可达性来判断是否需要回收。内存泄漏就是 在当前应用周期内不再使用的对象被GC Roots引用,造成该对象无法被系统回收,以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费,使实际可使用内存变小。简言之,就是 对象被持有导致无法释放或不能按照对象正常的生命周期进行释放。

Android常见内存泄漏汇总

3、内存抖动

指的是在短时间内大量的新对象被实例化,运行时可能无法承载这样的内存分配,在这种情况下就会导致垃圾回收事件被大量调用,影响到应用程序的UI和整体性能,最终可能导致卡顿和OOM。

常见情况:在一些被频繁调用的方法内不断地创建对象。例如在View 的onDraw方法内new 一些新的对象。

注意内存抖动也会导致 OOM,主要原因有如下两点:

1、Android Studio Profiler

作用

优点

内存抖动问题处理实战

理解内存抖动的概念的话,我们就能明白只要能找到抖动过程中所产生的对象及其调用栈,我们就能解决问题,刚好Android Studio 的Porfiler里面的Memory工具就能帮我们记录下我们 *** 作过程中或静止界面所产生的新对象,并且能清晰看到这些对象的调用栈。

选择Profile 中 的Memory ,选择 Record Java/Kotlin allocations,再点击Record开始记录, Record Java/Kotlin allocations 选项会记录下新增的对象。

*** 作完成之后,点击如图所示的红脑按钮,停止记录。

停止记录后,我们就可以排序(点击 Allocations可以排序)看看哪些对象或基本类型在短时间被频繁创建多个,点击这些新增的对象就可以看到它的完成的调用链了,进而就找找到导致内存抖动的地方在哪里了。

2、利用DDMS 和 MAT(Memory Analyzer tool)来分析内存泄漏

我们利用工具进行内存泄漏分析主要是用对比法:

a先打开正常界面,不做任何 *** 作,先抓取一开始的堆文件。

b一顿胡乱 *** 作,回到原来 *** 作前的界面。主动触发一两次GC,过10秒再抓取第二次堆文件。

c通过工具对比,获取胡乱 *** 作后新增的对象,然后分析这些新增的对象。

DDMS作用:抓取堆文件,主动触发GC。(其实也是可以用Android Studio 的Profile里面的Memory工具来抓取堆文件的,但是我这边在利用Profile 主动触发gc 的时候会导致程序奔溃,也不知道是不是手机的问题,所以没用Android Studio的Profiler)

MAT作用:对堆文件进行对比,找到多出的对象,找到对象的强引用调用链。

以下是详细的过程:

步骤1打开DDMS,选择需要调试的应用,打开初始界面,点击下图的图标(Dump Hprof File)先获取一次堆文件。

步骤2对应用随便 *** 作后,回到一开始的界面,先多触发几次GC ,点击下图的图标(Cause Gc)来主动触发GC,然后再次点击 Dump Hprof File 图标来获取堆文件。

步骤3通过Android Studio Profile 或者 DDMS dump 的堆文件无法在MAT 打开,需要借助android sdk包下的一个工具hprof-convexe来转换。

格式为 hprof-conv 旧文件路径名 要转换的名称;

例如:hprof-conv 2022-04-13_17-54-40_827hprof changehprof

步骤4把两份堆文件导入MAT,然后选择其中第二次获取的堆文件,点击 如图所示的 Histogram查看。

步骤5点击下图图标,Compare To Another Heap Dump ,选择另一份堆文件。

6会得出下图所示的 Hitogram 展示,我们主要看Objects 这一列。 如下图所示 “+ 2” 则代表前面两份堆文件对比,这个对象多了两个,我们主要就是要分析这些多了出来,没有被回收的对象。

7加入我们从增加的对象中,看到了MainActivity ,则需要从一开始打开的Hitogram 展示里面找到这个对象的调用栈。如下图所示,搜索MainActivity

8看到下图所示解雇,然后鼠标右键点击下图红色圈圈着的MainActivity ,选择 Merger Shortest Paths to Gc Roots ,再选择 exclude all phantom/weak/soft etcreferences ,就可以看到这个MainActivity 对象的强引用链,至此我们就可以找到MainActivity对象是被什么引用导致无法回收了。

3、内存泄露检测神器之LeakCanary(线下集成)

自行学习了解,接入简单,使用简单,基本可以解决大部分内存泄漏问题。

github地址 : >

因为安卓系统的优化不是那么好,在长期运行中会逐渐产生很多的垃圾和缓存,特别是运行内存。有时哪怕把所有后来下载的应用程序都卸载了,发现也不会变得快。

给几个建议:

1,买安卓系统的手机,选择运行内存和存储内存大的。

2,定期使用手机管家或者360卫士清理手机,特别是qq和微信。

3,不要下载过多的、不常用的软件,以免占用过多的内存。

4,过一段手机将手机重启,可以优化,释放一定的内存,手机运行也会更好。

简单的说android系统是基于linux的,linux系统使用内存的一个特点就是“不用白不用”,因为系统代码如果放在内存中会加速程序执行,所以如果内存足够,把程序放到内存中是有好处的。当然linux也有一套内存回收机制算法,当内存不足时,会触发内存回收。所以只要程序运行没有问题,系统占用内存越多,内存使用率越高,对系统运行是有益的。

运行内存是指手机运行程序时的内存也叫RAM而另一个内存是用来存储东西的内存,就像8G的MP4一样,它拥有运行内存8G的存储空间,这种内存叫ROM (简称运存)。

手机的运行内存就是指它自身的内存也就是C盘的大小 不包括存储卡或者硬盘手机的硬盘容量。

用电脑比喻的话手机的运行内存就是电脑的内存 但是手机的运行内存可以存储 电脑的不能存储。

拥有更大的运行内存的话手机可以打开更多的程序,如果本身容量足够的话并不能提升多少运行程序的速度,只能说更大的运行内存能更好的保证手机的正常运行。

内容整理自网络。

在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大部分内存可能被我们占用了,所以减少的内存占用可以带来直接的效果。本文就简单介绍一张到底占用多少内存,我们先假设我们有一张时 600 800 的,占用空间大小假设是 100KB。

内存大小跟占用空间大小有什么关系?

占用空间的大小不是占用内存的大小,一些初学者可能会误解一下。占用空间是在磁盘上占用的空间,内存大小是加载到内存中占用的内存大小。两个只是单位是一样的,本质不是一个概念。

一张到底占用多少内存呢?(ARGB_8888编码)

1 占用内存的计算公式: 高度 宽度 一个像素占用的内存大小

2 所以上面的占用内存是:800 600 4 byte = 1875KB = 183M

上面的计算公式中,为什么是4byte呢?文章后面有总结哦

所在目录对内存的影响?

在Android中,的存放目录和手机的屏幕密度影响最终的大小,举个例子:

假设我们的放到 xhdpi 目录下,那么我们本文中的占用的内存大小如下:

屏幕密度为2的设备:800 600 4byte = 183M

屏幕密度为3的设备:800 15 600 15 4byte = 183 225M = 412M

所以,计算占用内存大小的时候,要考虑所在的目录跟设备密度,这两个因素其实影响的是的高宽,android会对进行拉升跟压缩。

总结

1 确实很占用内存,内存优化先考虑内存占用;

2 一定要避免使用大,这就是9图很有用的原因之一;

3 的大小对内存的影响是正比关系;

4 本文只是简单的告知读者怎么计算的内存大小。

大图: 440 336    小图: 220 168 资源目录: xhdpi

小图的高宽都是大图的1/2-->小图是原图的1/4

界面效果:

测试设备: Coolpad   8676-M01   51   density=20

测试前准备 *** 作: 同一款设备,设置前后多次调用gc直到内存短时间内保持稳定不再变化

内存使用情况: 下图依次是 初始内存,大图内存,小图内存

大图占用内存: 1123 MB - 1066 MB = 057 MB

小图占用内存: 1081 MB - 1066 MB = 015 MB

大图小图内存关系: 015 MB 4 = 060 MB 约等于 057 MB (这是统计工具的误差,理论上就是相等的)

同样的方式在另外一台设备小米4c上得到的结果如下:

测试设备: Xiaomi   Mi-4c   V8210LXKCNDL   511   density=30

大图占用内存: 1322 MB - 1195 MB = 127 MB

小图占用内存: 1227 MB - 1195 MB = 032 MB

大图小图内存关系: 032 MB 4 = 128 MB 约等于 127 MB

结论: 由此可见大图比小图占用更多的内存,大小(分辨率)与占用内存成正比关系

备注: 在硬盘上占用的磁盘空间大小,与在内存中占用的内存大小完全不一样,不是一个概念,不要混淆

根据上文中大小与内存的关系,可以更加深刻的理解Android中9的作用,它不但能减少apk的体积,还能减少占用内存。

有些时候我们根本不需要,而是自己绘制背景,可以在自定义View的onDraw中绘制背景,当然最方便的还是使用系统的Drawable,绘制部分交给系统去完成。

下面测试与Drawable的内存占用对比

原始大小: 482 482

界面效果:

测试设备: Xiaomi   Mi-4c   V8210LXKCNDL   511

测试前准备 *** 作: 同一款设备,设置背景前后多次调用gc直到内存短时间内保持稳定不再变化

内存使用情况: 下图依次是 初始内存,使用占用的内存,使用Drawable占用的内存,使用onDraw绘制占用的内存

使用占用内存: 1397 MB - 1197 MB = 200 MB

使用Drawable占用内存: 1197 MB - 1197 MB = 000 MB (不会是0,有误差,只是很少)

使用onDraw绘制占用内存: 1198 MB - 1197 MB = 001 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 12004/1024/1024=879MB的内存。

采用低内存占用量的编码方式,比如BitmapConfigARGB_4444比BitmapConfigARGB_8888更省内存;

1920 1200的:

ARGB_8888:1920 1200 4/1024/1024=879MB

ARGB_4444,RGB565:1920 1200 2/1024/1024=439MB

在Android中,对的使用一定要关注,大多数情况下,占用内存多,OOM发生都是因为资源使用不当。不要盲目加一个大图到Android项目中,能使用9进来使用,而且9图本身尽可能小,另外能使用绘制实现就不要加一个资源。有些时候,在不影响用户体验的情况下,可以降低素材质量,比如不需要透明度的就不要了,有些透明度用肉眼看不出来。

以上就是关于安卓手机内存不足的原因及解决方法是什么全部的内容,包括:安卓手机内存不足的原因及解决方法是什么、安卓手机为什么内存总占用70%左右,是否对手机运行有影响,怎么降低内存占用率、为何安卓内存系统占一半,内存扩再大,体验还是卡等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9311679.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存