-
安卓中图片占用内存大小分析
2017-11-14 15:27:08位深是指计算机系统中图片的一个像素点占用的二进制位数。例如位深32,就是使用2^8 = 32 位二进制来表示像素值。例如11111111 00000000 00000000 00000000 代表黑色,转成16进制就是 ff000000,也就是我们常见的颜色...相关概念:
- 位深
- 色彩空间
- 颜色通道
- int型占用字节
位深: 位是二进制的位。位深是指计算机系统中图片的一个像素点占用的二进制位数。例如位深32,就是使用2^8 = 32 位二进制来表示像素值。例如11111111 00000000 00000000 00000000 代表黑色,转成16进制就是 ff000000,也就是我们常见的颜色的表示方式(#ff000000)。
色彩空间: 色彩空间又叫色域。是指颜色的范围、集合。在描述颜色时,颜色范围可以是立体而不单单是平面的,所以用空间来形容更为合适。 例如hsl,hsv色彩空间,它们对颜色的描述就是立体的。
颜色通道: 通道是合成图片的单位、容器。所有通道中的所有颜色要素(要素不一定是颜色),经过渲染合成了一个彩色图片。例如cmyk有c,m,y、k四个通道,每个通道对应一种构成颜色的要素,4个通道中的颜色值合一,就成了一个图片。其他如lab、rgb等色彩模式成像的过程也是类似的。
int型占用字节数: java中int型占用32位内存==4字节。表现形式就是32个二进制位(01)。用这32个二进制表示正负整数,因为其中有一位是正负符号位,故而其实只有31位是数字,于是int型能够表示的整数范围就是
10000000 00000000 00000000 00000000
到01111111 11111111 11111111 11111111
`-2^31 ~ 2^31-1 (-2147483648~2147483647)。
Android中的bitmap
Bitmap就是位图,我们也就是我们常见的xxx.bmp图。
位图所占内存
1024 * 1024像素的位图,保存时设置位深32位,无压缩,且不添加额外描述信息时,在硬盘上一定是
(1024 x 1024 x 32) 位 = (1024 x 1024 x 32 / 8)字节 = 4兆
,不多不少,若位深24,则为3M。这一点可以用Photoshop随意保存一张bmp格式的图来验证。安卓中颜色的表示
java 中一个int型占用内存为4字节。最高正好足够用来描述32位深的图片。例如:int 黑色 = 0xff000000 = 11111111 00000000 00000000 00000000。是一个负数。
安卓Bitmap配置
安卓中Bitmap配置 Config.ARGB_8888,表示的是argb每个通道中的色彩都使用2^8=256个级别(00~ff)来表示。其位深就是8(位)*4(通道) = 32。
其他配置如:
Config.ARGB_4444 = 4*4 = 16位深。
Config.RGB_565 = 5+6+5 = 16位深。其中r通道和b通道颜色级别划分为2^5个颜色,g为2^6个颜色。说了那么多。其实位图占用内存大小就是像素数组占用内存大小。
但是,这个数组,类型可能是不一样的。Bitmap的许多实现是底层的,由C/C++控制的,像rgb565,argb4444 这种一个像素占用16位==2个字节的配置来说,使用int32会造成内存浪费,但具体进行了怎么的优化就不知道了,在java层,我们是看不到的。
安卓中Bitmap所占内存
嗯,安卓中位图所占的内存当然也是应该是数组所占内存来的,但是具体到bitmap对象,自然有所不同,因为图片编码并不是没有除了色彩之外的其他信息,同时在具体算法、操作细节上,都可能影响到Bitmap。像素数组占用内存大小只能说是构成一个bitmap所需的最小内存。
so,要计算bitmap占用内存,还是得参看官方的api:
bitmap.getByteCount();
//返回可以用来存储这个位图的像素的最小字节数。这个方法实际上也是计算像素数组所占内存大小(一行所占行字节总数 * 高)看其源码:
public final int getByteCount() { if (mRecycled) { Log.w(TAG, "Called getByteCount() on a recycle()'d bitmap! " + "This is undefined behavior!"); return 0; } // int result permits bitmaps up to 46,340 x 46,340 return getRowBytes() * getHeight(); }
但是,源码推荐我们用下面这个:
bitmap.getAllocationByteCount();
这个方法是api19开始推荐用的,是一个native方法,计算内存大小的方法在c/c++ 层。更为合理了。
so,最后整理得出计算bitmap占用内存大小的代码:
/** * 计算bitmap位图所占的内存大小 * * @param bitmap * @return bitmap占用的内存大小 */ @SuppressLint("NewApi") public static int getBitmapSize(Bitmap bitmap) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { return bitmap.getAllocationByteCount(); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) { return bitmap.getByteCount(); } if (!bitmap.isRecycled()) { return bitmap.getRowBytes() * bitmap.getHeight(); } return 0; }
其他说的不准确的地方,就不关我的事了。黑黑。
——end
-
安卓图片内存优化(一)——图片占用内存大小的计算
2017-09-15 22:30:59安卓开发中经常会遇到因为图片处理不当导致的oom问题,因为系统分配给每个应用的最大内存空间是有限的,正常只有几十上百兆(排除通过特殊情况获取到几百兆内存空间的情况)。所以为了节省更多的空间需要对图片进行...安卓开发中经常会遇到因为图片处理不当导致的oom问题,因为系统分配给每个应用的最大内存空间是有限的,正常只有几十上百兆(排除通过特殊手段获取到几百兆内存空间的情况)。所以为了节省更多的空间需要对图片进行内存优化。
对于很多初学者来说应该都会有这样的疑惑:
只是加载了一张几百k的图片而已,为什么也会导致oom的问题?想知道问题的答案我们得弄明白图片在内存中占用的空间大小是如何计算的。
1. 图片相关的几个概念:
像素:
像素是组成图片的最基本单元要素。可以看做是一个点。
分辨率:
分辨率是指在长和宽上各拥有的像素个数
假如有张分辨率是1080*1920的图片,那它的宽度方向上有1080个像素点,高度方向上有1920个像素点,所以这张图片总共拥有2073600个像素点。2. 图片占用内存大小的计算:
2.1 图片的载体
图片加载到内存后是以bitmap的形式存在的,所以bitmap占用内存空间大小,就是图片在内存中占用空间的大小。
2.2 bitmap占用内存空间的计算
bitmap的内存大小是以图片像素点总数乘以每个像素点所占的内存大小的结果。
所以图片占用内存的大小只跟图片分辨率和每个像素点占用的内存大小有关。2.3 图片的色彩格式
bitmap的每个像素占用内存的大小跟色彩格式有关。
系统为我们提供了四种色彩格式:ARGB_8888:占用4个字节,默认该格式显示
ARGB_4444:占用2个字节
RGB_565:占用2个字节
ALPHA:占用1个字节
如果按照默认色彩格式显示的话,那么一张分辨率是1080*1920的图片加载到内存后占用空间的大小是:
1080 * 1920 * 4=8294400 byte,换算成m的话就是大概8m的空间大小。
所以说一张本地的图片可能只有几十上百k但是加载到内存后就会占用好几兆的空间。图片占用内存的大小只跟该图片的分辨率有关,跟图片在本地占用空间的大小无关。一张几十兆的图片如果分辨率低,而一张几十k的图片如果分辨率高的话,加载这两张图片到内存后不做任何处理,那么占用内存的大小反而是几十k的比几十兆的大。3. 总结
图片占用内存大小的两个关键因素:
1.图片的分辨率
2.采用的色彩格式本地图片跟加载到内存后的图片占用空间的大小之所以会差别很大,原因是因为本地的图片正常都是经过一定压缩的,但是只是压缩图片质量而已,并不会改变分辨率。所以你把一张图片压缩后输出到本地,再把该图片和原图加载到内存后会发现两张图片占用的内存大小是一样的,因为两张图片的分辨率是一样的。
-
tomcat 占用的内存越来越大_手机系统占用内存越来越大,是谁的锅?
2020-12-15 19:38:25不知道大家有没有发现,不管是安卓系统还是 ios 系统,系统占用的空间好像越来越大,比如这样的。还有这样的。甚至 64G?失敬失敬,你才是大哥。明明 1 个多 G 的系统固件,瞬间变成 10 多个 G,压缩能力再强也不能...大家好,我是老思机。
不知道大家有没有发现,不管是安卓系统还是 ios 系统,系统占用的空间好像越来越大,比如这样的。
还有这样的。
甚至 64G?失敬失敬,你才是大哥。
明明 1 个多 G 的系统固件,瞬间变成 10 多个 G,压缩能力再强也不能这么骚吧,非逼我换个容量更大的手机咩。
这一切的背后,究竟是人性的扭曲?还是道德的沦丧?请跟随老思机脚步,一起走进今天的老思机解密!
安卓系统占用为什么越来越大
大家第一个想到的应该是系统升级和功能更新占用了一定的空间。
恭喜你答对了一半,因为还有另外的原因!
假如你够细心,应该会发现买的手机容量越大系统占用也越大,真的很神奇。
为什么会这样?这就跟安卓系统分区有关了,好比电脑上的 C、D、E 盘,安卓也是有分区的。
在大多数厂商那里,他们把机身总容量根据百分比划分分区,分给系统和数据存储。
但系统统计的时候只进行系统总容量的统计,而不是分为可用和已用。
所以我们才会看到系统占用越来越大的情况。
至于为什么要这样统计,咱也不好说,咱也说不清。
除此之外,还有另一个原因。
首先要说说几年前的手机容量,比如 4G ROM 存储的手机,为什么能容纳得下一个功能齐全的安卓系统?
毕竟功能齐全的安卓系统安装后最少也得三四个 G,加上系统缓存,4G 容量怎么够装?
原因说来也简单,以前的安卓系统是 32 位,现在是 64 位。
32 位系统所用的代码相对少了些,比 64 位版本容量占用多了两三倍,更何况功能也比现在少,所以才会那么小。
不过吼,64 位系统虽然占用容量多,但支持更多硬件,比如支持 64 位 CPU,运算量多了一倍,能让手机跑得更快!
那么这么多的占用空间,到底是什么组成的呢?
下面以老思机 7.5G 的系统分区为例,通过工具分析发现,系统占用主要是在系统分区根目录下的 System 这个文件夹里,这个文件夹有什么秘密?
如果你有 Root 权限,你会发现里面主要是预装 App 的安装包,以及系统功能文件,它们占据了系统分区中的大部分容量。
以上就是安卓系统占用空间越来越大的原因了,总结下就是:
因为厂家设定系统分区百分比占用机身内存,且为 64 位系统,以及功能升级导致我们看到的系统占用越来越大。
安卓系统占用大的解决方法
那么有没有解决方法呢?有的,回退旧版本系统,或是 Root 后卸载不需要的功能并精简系统,别无他法。
但老思机还是想说,安卓系统分区已经固定分配了,一般情况下无法把其它文件存储到系统分区。
因此无法把这些空间用作其它用途,相对的,我们更该注意的是存储空间的清理。
可是老思机多次使用发现,很多系统自带的清理软件往往不能清理彻底,所以老思机把自己常用的一个清理软件介绍给大家。
这款应用功能比较有针对性,并且支持分身应用缓存清理,但最让我喜欢的是,这货的扫描速度超快!
(可以针对各软件和分身缓存进行清理)
而且对小白比较友好,各个地方都有提示和详细的说明。
相对于系统自带清理软件扫描两三分钟的时间,它几十秒就搞定了。
至于缺点?大概就是试用后要付费使用,但有些鸡蛋里挑骨头了。
因为定价很低,一顿早餐价,个人来说可以接受,毕竟好作品值得支持。
想要这款软件的,后台回复数字【 508 】,即可获取。
那么苹果系统占用为什么也是越来越大呢?
苹果系统占用为什么越来越大
同样的,苹果系统占用越来越大的原因也跟新系统功能更新离不开关系,跟安卓一样,新功能的加入导致苹果系统空间占用增加。
除这之外,还有一个原因是实时显示的数值异常。
由于系统需要时间检索容量使用情况,这时会出现数值异常,远超正常的系统占用容量,在存储空间页面等待几分钟即可显示正常。
最后则是系统升级更新残留缓存的问题,小伙伴们可能会安装描述文件进行 Beta 版的升级更新。
但 Beta 版升级有时会残留缓存并计算到系统里,造成系统占用空间过大。
这时候要节省空间的话一了百了直接抹机就可以了。
以上就是有关手机系统占用空间越来越大的原因啦,不过随着硬件的不断发展和升级,相信以后换机成本会更低,管它系统占用再怎么高,那都不是事。
本文编辑:思机不开车
手机容量快爆满的点这里
-
安卓性能监控(APM)之内存占用监控
2020-05-29 17:17:23获取内存占用信息. 获取系统内存信息 ActivityManager.MemoryInfo() availMem:系统可用内存大小。 totalMem:系统总共内存大小 threshold:系统开始kill后台服务和进程的内存阈值大小 lowMemory:系统处于低...目标
监控app使用的内存以及系统可用内存等内存相关信息.
方案
- 周期性监控,如10秒或1分钟等.
- 获取内存占用信息.
- 获取系统内存信息
ActivityManager.MemoryInfo()
availMem:系统可用内存大小。
totalMem:系统总共内存大小
threshold:系统开始kill后台服务和进程的内存阈值大小
lowMemory:系统处于低内存时该值为true- 获取App占用内存信息
Runtime.getRunTime()
maxMemory:App最大可用内存
freeMemory:App可用内存大小
total_memory:App当前占用内存- 获取App Native部分占用内存信息
Debug.getNativeHeapSize() Debug.getNativeHeapAllocatedSize() Debug.getNativeHeapFreeSize()
Debug.getNativeHeapSize(): native heap大小
Debug.getNativeHeapAllocatedSize() : 获取native已分配的内存大小
Debug.getNativeHeapFreeSize(): 获取native可用内存大小源代码
https://gitee.com/cxyzy1/MyAPM
参考资料
https://juejin.im/post/5a420e6d518825519408e0ca
关注头条号,第一时间获取最新文章:
-
安卓系统app可用内存分析
2017-12-08 11:43:07部分安卓app由于功能需要占用非常大的内存 需要在xml配置文件里面设置应用申请最大内存 android:largeHeap="true" 在安卓5.0以下的系统,内存申请非常有限,现在主流系统是5.0 - 8.0之间 不在具体分析5.0以下系统 在... -
安卓系统内存检测--StatFsProgressBar:自定义view
2017-11-09 10:53:32先上图: ------------------------...项目要求在很多界面中展示最底部的内存状态:占用空间,可用空间大小;考虑多界面复用,我自定义view 首先绘制布局、[java] view plain copy <RelativeLayout xmlns:android="h -
安卓Handler内存泄漏
2017-02-08 20:54:21首先你要知道内存泄漏,相对于安卓来说“泄漏”就是添加,系统分配给每个应用的内存大小一定,如何利用好内存尤为重要,如果我们的对象不能被垃圾回收机制及时回收就会出现内存泄漏,导致最后内存占用越来越大,出现... -
安卓系统组态软件_一款功能强大安卓系统工具软件蟒蛇下载
2020-12-12 00:10:40特色1、这款软件占用内存小,而且搜索功能强大;2、支持任何格式的搜索,不用转换;3、丰富的资源,快速的搜索功能,全部的免费无广告;4、丰富的种子筛选功能,让你更加高效的找到自己需要的资源内容;5、强大的种子... -
【安卓】常见的安卓中的内存泄漏总结
2016-11-20 17:20:19系统内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的... -
android第一篇:安卓内存优化,泄漏与引用
2020-05-12 17:08:373:安卓性能优化之内存优化 为什么要做内存优化? 如果不优化内存,1)app运行内存...2.1)安卓系统内存分配方式和回收方式 2.2)app内存限制机制,app运行吃内存大户是图片。 2.3)切换应用时,后台app清理机制。Ap -
安卓手机老是提示内存不足如何解决
2019-11-02 22:28:45安卓手机经常会提示内存不足,遇到这种情况可以通过下面方法来解决。 第一、清理手机内存 可以用360手机卫士来清清理,对手机做好大扫除,释放内存。...有些软件占用内存比较大,而且是装在手机... -
windows2008开机占用多少内存_手机内存都达到了12GB,为什么系统还是占据了一半?你知道原因吗...
2020-12-13 00:12:59众所周知,安卓手机的运行内存小的话,使用体验会...在几年前,手机2GB的运行内存都算挺大的了,而如今手机运行内存越来越大,在日常体验方面都有了很大改善,最重要的一点就是手机变流畅了。不过大家有没有发现,之... -
ios最系统是什么_塞班系统流畅度相当于ios,占用内存也很小,为什么会被淘汰?...
2021-01-13 07:17:36首先我们来说塞班系统占用内存小同时好用,只不过是在功能机时代,而在智能手机时代塞班系统一点都不好用,这是实实在在的,甚至于要知道安卓当年2.1时代也比塞班最后成熟的系统强太多。纵观整个塞班系统的发展轨迹... -
基于安卓平台的车载免提系统的软件设计
2020-05-28 16:07:12通过真机测试结果表明,该免提应用运行内存只占用300 k B左右,可以流畅运行,能够支持免提电话、数据同步、音乐播放等基本功能需求的同时,还添加了来电自动接听功能,达到了车载免提终端系统的更高要求。 -
aix么把占用的端口释放掉_华为手机如何清理垃圾?只需4步操作,就可彻底释放手机内存空间...
2020-12-29 01:55:17不管是苹果手机,还是安卓手机,使用时间久了,就会产生非常多的垃圾,占用大量的手机内存,导致手机内存空间不足,从而影响手机的运行速度,尤其是那些比较老的手机,存储内存只有16G,甚至只有8G。那么怎样快速... -
Android-内存管理
2020-07-21 14:57:24系统内存不足时,会有一个合理的回收再分配内存的机制,保证新的进程能够正常运行。 2. Android内存管理机制 1. 分配机制 弹性内存分配:开始分配一个小的内存大小(根据物理设备的内存大小决定),等到当前内存... -
android 内存优化
2016-05-25 17:08:38最近在研究一个安卓项目内存优化的问题,确实这是一个比较系统的工程,和个人的代码习惯以及对jvm原理的掌握有很大关系,下面提示一些注意点 1. 内存优化 Android系统对每个软件所能使用的RAM空间... -
安卓有效避免oom
2013-04-15 12:03:29android应用里,最耗费内存的就是图片资源。而且在Android系统中,读取位图Bitmap时,分给...严格控制内存 bitmap对象在java和C中都有内存占用。即使java回收了bitmap对象,C中的是不会自动释放的。所以需要及时调用rec -
除了安卓模拟器还有什么方式玩刺激战场等吃鸡手游效果好?
2018-04-13 15:24:59给大家参考:1、凤凰系统(免费)原理是在电脑上安装一个安卓系统,可以外设接入手柄或者直接用鼠标键盘电脑玩,会占用较大的电脑内存,电脑配置不够的玩家的慎用。据部分玩家说,用的时候匹配到安卓模拟器玩家的... -
超级手电筒最亮的_超级手电筒安卓版|超级手电筒app下载_v15_9ht安卓下载
2021-01-13 16:18:29超级强大的超级手电筒,附加闪灯、警示灯,电报效果,是集照明、应急、娱乐一体的实用安卓手电筒。软件介绍超级手电筒是一款功能强大的手电筒应用,超级手电筒app...3、占用内存及小,启动超快;4、图形分辨率高;5、... -
Android中的内存管理机制
2017-07-05 15:17:02最近一个在学习安卓的...在系统内存不足的时候,需要有一个合理的回收再分配的机制,以保证新的进程可以正常运行。回收的时候就要杀死那些正在占有内存的进程,操作系统需要提供一个合理的杀死这些进程的机制,以保证 -
Android开发笔记之内存问题。
2017-04-14 16:44:51程序崩溃问题,目前我确定为,程序内存占用较大。最后被系统kill掉。因此开始研究内存占用问题。 百度到的一些有用的启发: 假如有三个activity,分别是main,a 和b . a和b都是需要很大内存的,在main中打开a... -
6-内存
2016-12-23 17:21:00▔)~这是一个很敏感的值~最近几年说起安卓机配置,先别管CPU是啥,普通机型的内存没有3G起步都不好意思卖~旗舰机内存不是4G起步的都不好意思宣传,然而,各种app占用的内存也是越来越大~总的来说,当一个对象持有Activity... -
关于小程序模式下拉在安卓机上卡顿
2020-12-09 02:55:26导致内存占用过多) 3.taro生成H5的布局Html层级太深 4.下拉列表的性能优化(我已经尽力了,taro官网的下拉H5也没做啥优化呀??搞不懂,可比较试试)</p><p>该提问来源... -
手机USB内存外加闪存详解
2012-05-09 23:20:22手机内存RAM和电脑内存一样,是用来临时储存文件的,内存越大,运行速度越快 ...以机皇为例将USB内存中的4GB分出来用作专门安装程序的分区叫做ROM,其中安卓系统本身就占用了2GB,还剩下2GB供你安装程序用,安 -
6900刷安卓的教程
2011-03-28 19:32:17ROM中集成32M-SWAP,手机内存即为128+32M,不占用SD卡空间,SD卡无需分区,如SD卡内含swap分区会被屏蔽;如需关闭ROM内swap可安装V2-V1补丁即可; 支持APP2SD,可将软件安装至SD卡,需SD卡有EXT3分区 补丁内容: ... -
手机运行内存6G,可是开机一会就变成2个多G了,为什么?
2020-09-29 11:04:51当然,安卓系统是一个开源的系统,各家安卓手机厂商都可以自行定制,如果有的手机厂商对系统定制的额外功能太多,或者自带了大量的程序,或者是优化没有做到位,就可能导致这款手机开机后占用的运存格外多,如果你还... -
为什么Android系统要比ios卡
2018-03-08 09:24:15安卓最大的特点是开源(所以垃圾软件就多了),系统占用空间小(采用的是linux内核) 苹果最大的特点是保密性较高(几乎无病毒),占用内存较小(运行速度快)(采用unix内核(非开源)) 由于安卓系统继承了Linux... -
安卓 每日一题 2020年2月问题及答案
2020-05-29 11:29:21Android 2月2日题:android图片占用的内存大小怎么计算? 答案:分辨率像素点大小。但是分辨率不一定是原图分辨率,而像素点一般就ARGB_8888(4字节)与RGB_565(2字节)。android系统会根据图片不同来源决定加载图片的... -
安全管家安卓_pc-cillin和腾讯电脑管家比较哪个更好
2020-11-09 22:47:13与其他杀毒软件相比,腾讯电脑管家注重的是“杀毒+管理”这种“2合1”创新模式,很好地将“杀毒”和“管理”融合起来,大大地降低了系统资源占用率,同时杀毒能力也没有丝毫降低哦,目前相关的安全软件还没有做到...
-
2014年重庆理工大学《电子商务(双语)》两套期末考试试卷.pdf
-
elemen
-
Android 获取外网IP地址
-
MySQL 四类管理日志(详解及高阶配置)
-
Python基础之定义变量、运算符、if语句
-
2014年重庆理工大学《管理信息系统》两套期末考试试卷.pdf
-
WEB前端学习计划.xmind
-
零基础极简以太坊智能合约开发环境搭建并开发部署
-
Mysql关于毫秒值问题
-
MySQL 触发器
-
前后端socket通信.zip
-
工资计算
-
MySQL 查询与高级查询(多表、嵌套和正则表达式)
-
html水印添加
-
MySQL 备份与恢复详解(高低版本 迁移;不同字符集 相互转换;表
-
扩展
-
海泰新光首次公开发行股票并在科创板上市招股说明书.pdf
-
access应用的3个开发实例
-
DT开源博客第一版.mp4
-
linux - 用户进程 内核线程 优先级