Android 开发高手课
张绍文
前微信高级工程师,Tinker 负责人
52721 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
导读 (1讲)
模块一 高质量开发 (25讲)
Android 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

03 | 内存优化(上):4GB内存时代,再谈内存优化

Android Bitmap内存分配的变化
LPDDR4X省电
LPDDR4性能
Malloc钩子
Malloc调试
自定义的“Allocation Tracker”
Allocation Tracker
Native内存不用管的误区
内存占用越少越好的误区
low memory killer机制
ART虚拟机的优化
Java内存不足导致频繁GC
应用被杀死、设备重启
内存分配失败
OOM
内存大小与操作系统、应用生态的关系
LPDDR RAM
手机内存与PC内存的差异
自定义的Allocation Tracker实现示例
内存问题的分享
内存优化的重要性
LPDDR5的发展
Native内存分配
Java内存分配
误区
卡顿
异常
移动设备发展
课后作业
总结
测量方法
内存问题
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
立即购买
登录 后留言

全部留言(78)

  • 最新
  • 精选
  • 孙鹏飞
    置顶
    更新了例子,完善了操作方式,支持了x86平台的编译运行,兼容7.1到9.0的手机和模拟器,支持x86和armv7a,已经相对稳定

    作者回复: 鹏飞棒棒的!

    2018-12-07
    38
  • 旁友💊有伐🤔
    兴致勃勃地去把sample下载下来想要拜读一下,发现是JNI里面看的我一脸懵逼

    作者回复: 可以顺着sample去看一下hook点,为什么这样hook。然后去看看allocate 监控的源码,不一定需要看懂sample的实现

    2018-12-06
    19
  • 李华
    我在电脑前,你也在电脑前,我沉默,你也不说话,但你用这篇专栏嘲笑了我。

    作者回复: 不要嘲笑自己就行,一步一步向前

    2019-10-31
    17
  • 小鹏
    大佬,越讲越难了

    编辑回复: 高手课,本身知识点就难一些哈,如果觉得哪里吃力,可以评论区提问。

    2018-12-06
    4
  • 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-10
    2
  • 镜像
    说一下今天作业的遇到的问题和解决,希望可以帮助到大家。 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-07
    2
  • 王洛民
    学习起来很吃力,文章好多都看不懂,现在在处理内存相关的问题,可以告知下都需要掌握哪些基础的知识吗?系统学习的,多谢多谢

    作者回复: 后面会统一的来讲

    2019-01-19
    2
  • $$$
    老师好,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-19
    2
  • 无知
    这是第三个了,没有一个能跑起来的。各种懵呀。

    作者回复: 可以看一下后面的例子答疑

    2018-12-14
    2
  • Lea
    "Android 8.0 以后应用保活变得困难很多,但依然有...",是使用Jobscheduler?

    作者回复: 不是,是一些黑科技

    2018-12-11
    1
收起评论
显示
设置
留言
78
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部