03 | 内存优化(上):4GB内存时代,再谈内存优化
张绍文
该思维导图由 AI 生成,仅供参考
在写今天这篇文章前,我又翻了翻三年前我在 WeMobileDev 公众号写过的《Android 内存优化杂谈》,今天再看,对里面的一句话更有感触:“我们并不能将内存优化中用到的所有技巧都一一说明,而且随着 Android 版本的更替,可能很多方法都会变的过时”。
三年过去了,4GB 内存的手机都变成了主流。那内存优化是不是变得不重要了?如今有哪些技巧已经淘汰,而我们又要升级什么技能呢?
今天在 4GB 内存时代下,我就再来谈谈“内存优化”这个话题。
移动设备发展
Facebook 有一个叫device-year-class的开源库,它会用年份来区分设备的性能。可以看到,2008 年的手机只有可怜的 140MB 内存,而今年的华为 Mate 20 Pro 手机的内存已经达到了 8GB。
内存看起来好像是我们都非常熟悉的概念,那请问问自己,手机内存和 PC 内存有哪什么差异呢?8GB 内存是不是就一定会比 4GB 内存更好?我想可能很多人都不一定能回答正确。
手机运行内存(RAM)其实相当于我们的 PC 中的内存,是手机中作为 App 运行过程中临时性数据暂时存储的内存介质。不过考虑到体积和功耗,手机不使用 PC 的 DDR 内存,采用的是 LPDDR RAM,全称是“低功耗双倍数据速率内存”,其中 LP 就是“Lower Power”低功耗的意思。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
手机内存优化在4GB内存时代仍然至关重要。随着移动设备的发展,采用LPDDR RAM(如LPDDR4X)的手机内存性能更高且更省电。然而,内存大小并非唯一考量,操作系统和应用生态也影响内存表现。因此,内存优化仍然是开发者需要关注的重要问题。 文章讨论了内存问题引发的异常和卡顿,以及内存优化中的两个误区。作者指出,内存占用越少并非一定越好,而对于Native内存的管理也需要引起重视。此外,文章还介绍了Android Bitmap内存分配的变化和在Android 8.0中新增的硬件位图Hardware Bitmap。最后,作者提到了Fresco图片库在Dalvik中将图片放到Native内存中的实现方法。 总的来说,本文强调了内存优化在移动设备开发中的重要性,同时提供了关于内存问题和优化误区的深入见解,对开发者进行了有益的技术指导。LPDDR5将在明年进入量产阶段,移动内存一直向着更大容量、更低功耗、更高带宽的方向发展。伴随内存的发展,内存优化的挑战和解决方案也不断变化。而内存优化又是性能优化重要的一部分。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》,新⼈⾸单¥59
《Android 开发高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(78)
- 最新
- 精选
- 孙鹏飞置顶更新了例子,完善了操作方式,支持了x86平台的编译运行,兼容7.1到9.0的手机和模拟器,支持x86和armv7a,已经相对稳定
作者回复: 鹏飞棒棒的!
2018-12-0738 - 旁友💊有伐🤔兴致勃勃地去把sample下载下来想要拜读一下,发现是JNI里面看的我一脸懵逼
作者回复: 可以顺着sample去看一下hook点,为什么这样hook。然后去看看allocate 监控的源码,不一定需要看懂sample的实现
2018-12-0619 - 李华我在电脑前,你也在电脑前,我沉默,你也不说话,但你用这篇专栏嘲笑了我。
作者回复: 不要嘲笑自己就行,一步一步向前
2019-10-3117 - 小鹏大佬,越讲越难了
编辑回复: 高手课,本身知识点就难一些哈,如果觉得哪里吃力,可以评论区提问。
2018-12-064 - 东diff --git a/alloctrackSample/src/main/cpp/allocTracker.cpp b/alloctrackSample/src/main/cp p/allocTracker.cpp index b5f4bee..a90dd1c 100755 --- a/alloctrackSample/src/main/cpp/allocTracker.cpp +++ b/alloctrackSample/src/main/cpp/allocTracker.cpp @@ -90,7 +90,7 @@ void hookFunc() { } else if (hookRecordAllocation24 != nullptr) { LOGI("Finish get symbol24"); // ZzWrap((void *) hookRecordAllocation24, beforeRecordAllocation, nullptr); - MSHookFunction(hookRecordAllocation26, (void *) &newArtRecordAllocation26, + MSHookFunction(hookRecordAllocation24, (void *) &newArtRecordAllocation26, (void **) &oldArtRecordAllocation26); } else if (hookRecordAllocation23 != NULL) { @@ -181,8 +181,7 @@ JNI_METHOD_DECL(void, setSaveDataDirectory) static void startARTAllocationTracker() { - LOGI(ALLOC_TRACKER_TAG, - "art, startAllocationTracker, func==NULL: %s, artEnvSetCheckJniEnabled==NULL: %s ", + LOGI("art, startAllocationTracker, func==NULL: %s, artEnvSetCheckJniEnabled==NULL: %s ", artEnvSetCheckJniEnabled == NULL ? "true" : "false", artVmSetCheckJniEnabled == NULL ? "true" : "false"); 修改了两点了,第一点改了之后android版本7.1.2的手机才能运行,第二点修改后log正常输出
作者回复: 赞
2019-07-102 - 镜像说一下今天作业的遇到的问题和解决,希望可以帮助到大家。 1.界面中的输出内存DUMP到日志,说的是把日志写入到Logcat的中并不是输入。 2.java代码中 new File(Environment.getExternalStorageDirectory(), "crashDump"); 是日志输出的文字,我们看Logcat中 saveARTAllocationData write file to XXXX 就能找到对应的日志文件,和git上说的路径可能不一致。 3.评论中有同学说看不到日志的输出。代码中 【tracker.initForArt(BuildConfig.VERSION_CODE, 5000);//从 start 开始触发到5000的数据就 dump 到文件中】 有说明开始后到达5000的数据才会写入文件。 大家设备内存情况不一样,GC回收的频率也不一致,在你不停生产1000个对象的时候,GC不断的跟随回收,导致无法达到 5000的数据量,所以一直没有日志的写入。 可以尝试修改对象的创建数量改成10000。
作者回复: 赞
2019-05-072 - 王洛民学习起来很吃力,文章好多都看不懂,现在在处理内存相关的问题,可以告知下都需要掌握哪些基础的知识吗?系统学习的,多谢多谢
作者回复: 后面会统一的来讲
2019-01-192 - $$$老师好,adb shell kill -S QUIT PID 这个命令,执行了一下,有几点实践记录如下: 1、其中“-S”文中是大写,实际执行是小写才行“-s”,查看adb shell kill的命令帮助如下: usage: kill [-s signame | -signum | -signame] { job | pid | pgrp } ... kill -l [exit_status ...] 2、我用了一台 小米5 Android 7.0 一台 三星S8 Android 8.0 和一台华为荣耀3 Android 4.4.2 没root的三台机器执行这个命令会提示kill: PID : Operation not permitted; 3、用了一个模拟器执行就可以
作者回复: 这个其实也可以在代码中给自己发信号,这样就没有权限问题。 可以看第六篇的补充篇
2018-12-192 - 无知这是第三个了,没有一个能跑起来的。各种懵呀。
作者回复: 可以看一下后面的例子答疑
2018-12-142 - Lea"Android 8.0 以后应用保活变得困难很多,但依然有...",是使用Jobscheduler?
作者回复: 不是,是一些黑科技
2018-12-111
收起评论