Android Memory(二) -- 应用内存占用分析

Android perfetto memory开源工具分析 深入浅出Android perfetto memory分析工具 阅读详情

前言

在工作这几年,我一直深受内存问题的困扰,在和内存的不断抗争中,我逐渐积累了一些内存的知识,接来下来我会用几篇文章简单记录一下这几年的我学到的内存相关的经验。另外,本系列文章不去过多的分析Linux底层代码,只是探讨遇到内存问题时的解决方法论。 以下是全部文章的标题:

  1. Android Memory(一) – 内存基础知识
  2. Android Memory(二) – 应用内存占用分析
  3. Android Memory(三) – 问题定位与分析
  4. Android Memory(四) – 问题解决方案1
  5. Android Memory(五) – 问题解决方案2
  6. Android Memory(六) – 内存日常监控
应用内存占用分析

1. 通过Android Studio自带的Memory Profiler查看内存

日常开发中,我们在监控应用内存占用是,经常使用的是AS自带的Memory Profiler, 如下图所示:

  1. 强制执行垃圾回收
  2. 堆转储,把内存信息通过文件的方式保存下来,可以进行分析
  3. 记录内存分配情况, 此按钮仅在连接至运行 Android 7.1 或更低版本的设备时才会显示
  4. 放大/缩小时间线
  5. 跳转至实时内存数据
  6. Event 时间线,显示 Activity 状态、用户输入 Event 和屏幕旋转 Event\
  7. 内存使用量时间线,其包含以下内容:
  • 一个显示每个内存类别使用多少内存的堆叠图表,如左侧的 y 轴以及顶部的彩色键所示

  • 虚线表示分配的对象数,如右侧的 y 轴所示

  • 用于表示每个垃圾回收 Event 的图标

    我们可以明显的看到,在上图有当前应用每一部分所占用的内存,其中包括Other、Code、Stack、Graphics等部分的内存占用情况,那么这几部分的内存占用是怎么得到的呢,我们接下来会做进一步的分析。

2. 通过 adb shell dumpsys meminfo ${PROCESS_NAME} 查看内存情况

这里我们选取手机上的一个应用Phoneix查看一下其内存占用情况: 执行命令:adb shell dumpsys meminfo com.trassion.phoneix 显示结果如下:

在上图中,我们可以看到App Summary部分,就是通过Memory Profiler界面上查看到的数值。 那么,问题来了,App Summary部分又是怎么计算得来的呢?

在上图中,我们注意到了App Summary上边的第一个表格的数据,莫非是根据这一部分计算来的吗? 答案是Yes,下面我们给出详细的计算规则:

Java Heap = Dalvik Heap private dirty+ .art mmap private (clean+ dirty) = 27412 + 4 + 7824 = 35240

Native Heap = Native private dirty = 98156

Code = .so mmap private (clean + dirty) + .jar mmap private (clean + dirty) + .apk mmap private (clean + dirty) + .ttf mmap private (clean+ dirty) + .dex mmap private (clean + dirty) + .oat mmap private (clean + dirty) = (520 + 2348) + (8 + 500) + (60 + 1764) + (0 + 48) + (15808 + 2316) + (0 + 0) = 23440

Stack = Stack private dirty = 6144 

Graphics = GL mtrack private (clean + dirty) + EGL mtrack private(clean + dirty) = (0 + 0) + (28769 + 0) = 28769

Private other= TOTAL private (clean + dirty) - Java Heap - Native Heap- Code- Stack -Graphic = (205245 + 7780) - 35240 - 98156 - 23440 - 6144 - 28769 = 21276

System = TOTAL - TOTAL private (clean + dirty)  = 309121 - (205245 + 7780) = 96096 
  • Private Dirty

    进程本身使用的内存总数,包含了进程主动申请的以及修改的继承自Zygote的内存。其实Private Dirty表示了该进程私有的,不跟Disk数据一致的内存段。例如堆(heap),栈(stack),bss段。

注:在新平台上,用于管理Dalvik的内存(如, just-in-time compilation (JIT) and GC bookkeeping)不再像以前一样归到 Dalvik Heap,而是归类到 Dalvik Other。

  • Private clean

    进程独自使用的so和dex。Clean内存的好处是在内存紧张时,可以释放物理内存。因为是clean的,所以不需要写回到disk,只需要下次读取该内存(导致缺页错误)时再从disk读入。

  • Heap Size/ Heap Alloc/ Heap Free

    Heap Alloc是(Dalvik、native)app申请的内存记录,包括了Private Dirty和继承自Zygote的(多进程共享的)内存。所以,它是比Pss Total和Private Dirty都要大的。

我们知道了Memory Profiler中的数值是从上边的第一个表格的数值计算而来,那第一个表格的数值又是从何而来呢? 我们接着往下看!!

3. 通过adb shell run-as com.transsion.phoenix "cat /proc/${PID}/smaps 查看Smap数据

这里我们选取手机上的一个应用Phoneix查看一下其内存占用情况: 我这边实现了一个简单的脚本如下:

#! /bin/bash
process_name=$1
PID=$(adb shell pidof ${process_name})
adb shell run-as com.transsion.phoenix "cat /proc/${PID}/smaps > /data/local/tmp/smaps.txt"
adb pull /data/local/tmp/smaps.txt $2 

执行 bash pull_smaps.sh com.transsion.phoneix 1.0.0_smaps.txt

我们可以简单看一下相关的smap文件:

看起来是不是一头雾水,这一个个的内存区间都是干什么用的?

我从github上copy来一个python3的脚本,专门做smap数据的解析,目前作者已经找不到的!

解析结果如下(解析结果较长,我将部分解析结果做了省略):

Unknown : 9.861 M
	pss: 8.443 M
	swapPss: 1.418 M
		[anon:partition_alloc] : 8520 kB
		[anon:.bss] : 935 kB
		[anon:linker_alloc] : 189 kB
		[anon:bionic_alloc_small_objects] : 120 kB
		[anon:thread signal stack] : 24 kB
		[anon:cfi shadow] : 24 kB
		[anon:System property context nodes] : 20 kB
		[anon:atexit handlers] : 9 kB
		[anon:arc4random data] : 8 kB
		[anon:bionic_alloc_lob] : 4 kB
Dalvik : 30.602 M
	pss: 29.222 M
	swapPss: 1.380 M
		[anon:dalvik-main space (region space)] : 23336 kB
		[anon:dalvik-free list large object space] : 4233 kB
		[anon:dalvik-zygote space] : 2525 kB
		[anon:dalvik-non moving space] : 508 kB
Native : 126.734 M
	pss: 99.627 M
	swapPss: 27.107 M
		[anon:scudo:primary] : 84810 kB
		[anon:scudo:secondary] : 41924 kB
Dalvik Other : 21.381 M
	pss: 18.341 M
	swapPss: 3.040 M
		[anon:dalvik-LinearAlloc] : 10612 kB
		/memfd:jit-cache (deleted) : 6344 kB
		[anon:dalvik-DEX data] : 3364 kB
                ...
                ...
Stack : 8.188 M
	pss: 6.148 M
	swapPss: 2.040 M
		[anon:stack_and_tls:4854] : 168 kB
		[anon:stack_and_tls:4870] : 148 kB
		[stack] : 148 kB
		[anon:stack_and_tls:4878] : 144 kB
		[anon:stack_and_tls:4877] : 144 kB
		...
		...
Cursor : 0.000 M
	pss: 0.000 M
	swapPss: 0.000 M
Ashmem : 0.204 M
	pss: 0.204 M
	swapPss: 0.000 M
		/dev/ashmem/gralloc_shared_memory (deleted) : 50 kB
		/dev/ashmem/MessageQueue (deleted) : 48 kB
		/dev/ashmem/AshmemAllocator_hidl (deleted) : 38 kB
		...
		...
Gfx dev : 0.000 M
	pss: 0.000 M
	swapPss: 0.000 M
Other dev : 0.020 M
	pss: 0.020 M
	swapPss: 0.000 M
		/dev/binderfs/binder : 12 kB
		/dev/binderfs/hwbinder : 8 kB
.so mmap : 9.051 M
	pss: 8.839 M
	swapPss: 0.212 M
		/vendor/lib64/egl/libGLES_mali.so : 4044 kB
		/system/lib64/libhwui.so : 661 kB
		/system/lib64/libstagefright.so : 328 kB
		...
		...
.jar mmap : 2.217 M
	pss: 2.217 M
	swapPss: 0.000 M
		/system/framework/framework.jar : 1241 kB
		/data/data/com.transsion.phoenix/app_pccache/5/3ADD07A77E5BC23D41D5235C3F0C964B75D847A9/pcam.jar : 360 kB
		/apex/com.android.art/javalib/core-icu4j.jar : 265 kB
		/apex/com.android.art/javalib/core-oj.jar : 173 kB
		/apex/com.android.art/javalib/bouncycastle.jar : 78 kB
		...
		...
.apk mmap : 17.179 M
	pss: 16.923 M
	swapPss: 0.256 M
		/data/app/~~l7NnUJ5BUuoASfLO4ps6rQ==/com.google.android.webview-cmrXpqowpCjrrfYc0lesEQ==/base.apk : 14642 kB
		/data/user_de/0/com.google.android.gms/app_chimera/m/0000004d/dl-AdsFdrDynamite.integ_221310604100000.apk : 850 kB
		/data/app/~~WkMxdLO_EFZvRB7Y7O4Tfw==/com.transsion.phoenix-PVevdVSKlTJCD3Q2aDbscQ==/base.apk : 783 kB
		...
		...
.ttf mmap : 0.140 M
	pss: 0.140 M
	swapPss: 0.000 M
		/system/fonts/Roboto-Bold.ttf : 99 kB
		/system/fonts/Roboto-Regular.ttf : 37 kB
		/system/fonts/NotoSansLaoUI-Regular.ttf : 4 kB
.dex mmap : 44.585 M
	pss: 19.645 M
	swapPss: 24.940 M
		[anon:dalvik-classes7.dex extracted in memory from /data/app/~~WkMxdLO_EFZvRB7Y7O4Tfw==/com.transsion.phoenix-PVevdVSKlTJCD3Q2aDbscQ==/base.apk!classes7.dex] : 10932 kB
		[anon:dalvik-classes6.dex extracted in memory from /data/app/~~WkMxdLO_EFZvRB7Y7O4Tfw==/com.transsion.phoenix-PVevdVSKlTJCD3Q2aDbscQ==/base.apk!classes6.dex] : 10864 kB
		[anon:dalvik-classes.dex extracted in memory from /data/app/~~WkMxdLO_EFZvRB7Y7O4Tfw==/com.transsion.phoenix-PVevdVSKlTJCD3Q2aDbscQ==/base.apk] : 9328 kB
		...
		...
.oat mmap : 0.079 M
	pss: 0.079 M
	swapPss: 0.000 M
		/system/framework/arm64/boot-framework.oat : 36 kB
		/apex/com.android.art/javalib/arm64/boot.oat : 19 kB
		/apex/com.android.art/javalib/arm64/boot-core-icu4j.oat : 13 kB
		...
		...
.art mmap : 11.323 M
	pss: 8.984 M
	swapPss: 2.339 M
		[anon:dalvik-/system/framework/boot-framework.art] : 7112 kB
		[anon:dalvik-/apex/com.android.art/javalib/boot.art] : 1711 kB
		[anon:dalvik-/system/framework/boot-telephony-common.art] : 756 kB
		...
		...
Other mmap : 2.297 M
	pss: 2.297 M
	swapPss: 0.000 M
		/system/fonts/NotoSansCJK-Regular.ttc : 1030 kB
		/data/misc/shared_relro/libwebviewchromium64.relro : 626 kB
		/data/data/com.transsion.phoenix/app_webview/BrowserMetrics/BrowserMetrics-6281F38F-12BF.pma : 256 kB
		...
		... 

以上合并的计算结果就是第二部分中第一个表的数据,其中有略微的差异, 是因为两个dump的时机是有微小的时间间隔导致。另外此部分的合并数据,没有包含GL相关的数据,GL相关的数据需要从显存中读取,此处暂时不做进一步的探讨。

从合并以后的结果来看,我们知道了进程每个部分详细的内存占用情况:

  • 如果是Native部分内存占用的比较高,如果是Android 8.0以上,我们首先去分析Bimap占用的内存是否异常。如果Bitmap占用正常, 那么此部分就主要是通过malloc和mmap进行分配的,我们可以通过Loliprofile或者Malloc Debug进行进一步的堆栈抓取,来解决不合理的内存分配。也可以通过xHook或者字节跳动的Native Hook工具去hook内存分配函数做进一步的内存定位;

  • 如果Code部分占用过多, 我们可以考虑优化包大小或者不合理的字体载入等;

  • 如果Java Heap占用比较多,如果是Android 5.0以上,Android 8.0 以下的设备,可以去看一下Bitmap的占用,如果Bitmap占用是正常的,需要分析是否有不合理的Java引用或者内存泄漏,此部分可以借助Android Studio自带的内存工具或者MAT做进一步分析, 此部分相对比较简单。

步的内存定位;

  • 如果Code部分占用过多, 我们可以考虑优化包大小或者不合理的字体载入等;

  • 如果Java Heap占用比较多,如果是Android 5.0以上,Android 8.0 以下的设备,可以去看一下Bitmap的占用,如果Bitmap占用是正常的,需要分析是否有不合理的Java引用或者内存泄漏,此部分可以借助Android Studio自带的内存工具或者MAT做进一步分析, 此部分相对比较简单。

最后

如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击扫描下方二维码免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

mmap泄漏追踪 相机内存泄漏分析——mmap泄漏 阅读详情

相关推荐

Android Memory 内存学习笔记

和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、Android 垃圾回收机制(GC)二、共享内存三、内存的申请与回收四、内存限制五、不同App切换时的内存管理Android Runtime(ART)和Dalvik虚拟机使用 分页 和 内存映射 来管理内存。这意味着应用程序修改的任何内存(无论是通过分配新对象通过映射页面)都将保留在RAM中,并且不能被...

程序员Android 504

Android面试题整理,优秀Android程序员必知必会的网络基础,震撼来袭免费下载!

想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。 25%的面试官会在头5分钟内决定面试的结果 60%的面试官会在头15分钟内决定面试的结果 一般来说,一场单面的时间在30分钟左右,而决定你生死的重要关键部分就是:自我介绍和三大问。 如果这部分回答的不好,除非后面的回答非常精彩,能够帮你搬回来,否则机会渺茫。 自我介绍大家都知道,什么是三大问呢?其实就是“3why”问题 为什么选择这家公司? 为什么应聘这个职位? 为什么要聘用你? Scudo是

CHAMPION8888的博客 565

android内存占用分析,Android App性能评测分析-内存篇

1、内存了解在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识、内存分配、内存管理机制等非常熟悉,才能排查问题。1.1 了解进程的地址空间在32位操作系统中,进程的地址空间为0到4GB,这里主要说明一下Stack和Heap:Stack空间(进栈和出栈):由操作系统控制,其中主要存储函数地址、函数参数、局部变量等等,所...

weixin_27027459的博客 2847

关于Linux线程的线程栈以及TLS

说明: a.本文描述Linux NPTL的线程栈简要实现以及线程本地存储的原理,实验环境中Linux内核版本为2.6.32,glibc版本是2.12.1,Linux发行版为ubuntu,硬件平台为x86的32位系统。b.对于Linux NPTL线程,有很多话题。本文挑选了原则上是每线程私有的地址空间来讨论,分别是线程栈和TLS。原则山私有并不是真的私有,因为大家都知道线程的特点就是共享地址空间,原...

系统运维 470

使用python统计Android应用内存以及CPU占用

内存占用 VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存) PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存) USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存) 获取USS:procra...

weixin_43835637的博客 3166

APP 内存测试--Android Memory Profiler实操(入门版)

Android Profiler的Memory Profiler组件, 可用于帮助我们分析内存泄露和内存抖动的问题。Memory Profiler的功能包括: 展示应用内存使用情况的实时图像、抓取内存的dump信息、强制垃圾回收及追踪内存分配。

weixin_52500918的博客 1598

Anroid 应用内存使用情况分析方法

通过 Android Studio 的 Profiler 工具步骤连接设备或启动模拟器,运行你的应用。打开 Android Studio,点击底部工具栏的Profiler(或选择Memory选项卡,即可实时查看应用的内存占用情况。可以点击或进行更详细的分析。

以后会多把工作中总结的知识、问题处理思路和方法通过博客分享出来,欢迎大家关注和共同探讨! 1802

android 如何分析应用的内存 (一)——内存总览

获得如下信息PSS:这是一种按照比列来划分内存的统计方法。比如一个共享库占1G。由两个进程共享,那么PSS的计算方式就是,将1G一分为2。分别为512M按照上图,举例如下:Native Head 按照PSS统计方法,占据107179KBPrivate Dirty:其中Private表示只有本进程可访问。Dirty表示还没有写回磁盘。举例如下:如上图第一行表示,分配给本进程的,已经被修改,但未写入磁盘的Native Heap大小为107140KB。

安仔的博客 3952

Android内存分析工具:Memory Profiler

Android Memory Profiler内存工具

橡果生长记的博客 3万+

3D视觉-激光三角测量法的概述和原理

激光三角法位移测量的原理是,用一束激光以某一角度聚焦在被测物体表面,然后从另一角度对物体表面上的激光光斑进行成像,物体表面激光照射点的位置高度不同,所接受散射或反射光线的角度也不同,用。激光三角测量法是一种通过图像采集系统采集被测物表面漫反射的激光轮廓,进而基于设备已知的相对位置通过算法处理,获得被测物表面的三维轮廓数据,进而还原目标物体三维空间信息的方法。采用激光三角原理和回波分析原理进行非接触位置、位移测量的精密传感器, 广泛应用于位置、位移 、厚度、半径、形状、振动、距离等几何量的工业测量。

qq_20660115的博客 3919

PLC模拟量输入电路设计:±10V与±20mA信号调理全解析

在工业自动化和数据采集系统中,模拟量输入是连接物理世界与数字控制的核心桥梁。无论是变送器输出的4-20mA电流环,还是伺服驱动与信号发生器提供的±10V电压信号,PLC和采集模块都需要在复杂现场环境下稳定、精准地完成信号采集。理解信号体制的原理——电流环抗长线干扰、电压环响应快——是设计模拟输入前端的基础。通过精密电阻网络实现分压与采样,利用运放完成双极性到单极性的电平搬移,配合TVS与滤波电路保障可靠性,并经过ADC量化与校准流程,最终构建出兼顾精度、成本和工业级鲁棒性的完整信号链路。本文面向硬件工程师与

weixin_29163797的博客 298

android native内存分析工具,Android内存分析工具:Memory Profiler

一、前言我们知道,Android系统检测到app有不再使用对象时,就会进行内存回收相关的工作。尽管Android检测无用对象、回收内存的方法在不断改进,但在目前所有的Android版本中,进行上述工作时,系统仍需要短暂地停止app的运行。在大多数情况下,系统进行内存回收的行为是无法被用户察觉到的。然而,如果应用分配内存的速度大于系统回收的速度,那么app进程的正常运行可能就回受到影响。毕竟,系统必...

weixin_32968007的博客 2028

433M遥控器无线解码1527协议

433M遥控器无线解码1527协议,定时器轮询法

weixin_58595117的博客 1万+

Android 内存分析工具 : Memory Profiler

一、前言 我们知道,Android系统检测到app有不再使用对象时,就会进行内存回收相关的工作。 尽管Android检测无用对象、回收内存的方法在不断改进, 但在目前所有的Android版本中,进行上述工作时,系统仍需要短暂地停止app的运行。 在大多数情况下,系统进行内存回收的行为是无法被用户察觉到的。 然而,如果应用分配内存的速度大于系统回收的速度, 那么app进程的正常运行可能就回受到影响。 毕竟,系统必须回收到足够的供app需要的内存,才会恢复处于暂停状态的app。 在这种情况下...

Venus 的博客 6317

静态与动态LACP链路聚合:原理、配置与排错实战指南

链路聚合技术是提升网络带宽与可靠性的核心方案,通过将多个物理端口逻辑捆绑,实现带宽叠加与链路冗余。其原理基于IEEE 802.3ad标准,通过负载均衡算法将数据流分布到不同物理链路,既避免了数据包乱序,又提升了整体吞吐量。该技术的核心价值在于消除单端口瓶颈、提供毫秒级故障切换,并能简化网络拓扑管理。在企业服务器接入、数据中心互联及虚拟化平台等场景中,链路聚合已成为构建高可用网络的基础。实践中,动态LACP模式通过协议报文协商,能主动检测链路故障并防止配置错误导致的网络环路,相比静态聚合更为可靠。本文将深入解

weixin_31412781的博客 268

实战全解|大疆司空2二次开发:从接口开发到第三方业务系统深度融合

大疆司空2二次开发是实现行业无人机定制化应用的关键,通过OpenAPI后端对接+前端组件集成的组合方式,可快速完成功能定制,而与第三方业务系统的深度融合,能彻底打通“业务下发-设备执行-数据回传-流程闭环”的全链路,让无人机管控真正融入行业业务流程。开发过程中,建议优先采用私有版部署保障数据安全,通过中间适配层降低系统耦合度,结合实际业务场景打磨功能,避免过度开发。随着大疆开发者生态的完善,司空2的二次开发能力将持续升级,为更多行业无人机应用提供技术支撑。

2501_93651177的博客 969

安卓应用开发中 WebView 内存占用过大问题详解

摘要 WebView在Android应用中展示网页时存在严重内存管理问题,主要表现为内存持续增长、应用崩溃和界面卡顿。主要原因包括未正确销毁WebView导致的内存泄漏、硬件加速带来的GPU内存激增,以及缓存未及时清理等。解决方案需从多维度入手:1) 严格遵循销毁流程,包括移除父容器、清除历史记录、销毁实例等;2) 合理管理硬件加速,按需启用或禁用;3) 将WebView放入独立进程以便彻底释放内存;4) 及时清理各类缓存数据;5) 针对低版本Android进行特殊处理。此外,对频繁使用WebView的场景

深山技术宅的博客 1386

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】Caliper从0到使用

技能大赛样题解析,caliper题目从0到使用

weixin_52865146的博客 2076

Android输出app内存占用情况

ActivityManager 提供系统整体内存状态的宏观视图,适合监控设备的全局内存状况。这个方法可以获取包括可用内存、总内存和系统是否处于低内存状态等关键指标。

Made In SQL 1501

CANoe:入门介绍

CANoe网络通信分析:CANoe用户可以在台架上或者车辆中分析ECU和整个系统的多总线通信。Trace窗口:用于列出所有总线活动,例如消息或错误帧。对于每条消息,都可以显示单独的信号值Graphics窗口:用于在时间轴上以图形方式在线显示消息和诊断请求中传输的值,例如rpm或温度值Statistics窗口:用于显示有用的网络和节点统计信息,例如节点和帧级别的总线负载、突发计数器/持续时间、帧和错误的计数器/速率、控制器状态Data窗口:用于显示预选数据,例如数字或条形图数据。

jasonj333 9750

【AUTOSAR-E2E】-1.4-详述E2E Transformer解决方案

共13页精讲 目录 1“Data Transformation”介绍 1.1 基于SOME/IP Transformer 1.2 基于COM Based Transformer 2 ComXf(COM Based Transformer)介绍 2.1 ComXf(COM Based Transformer)功能规范 2.2 ComXf(COM Based Transformer)提供的服务 2.3 配置注意事项 3 E2EXf(E2E Transformer)介绍 3.1 E2EX...

「汽车电子助手」的博客 4700

android native内存分析工具,Android内存分析工具 — Memory Profiler

目录前言Android 存在内存回收机制,当它确定应用不再使用某些对象时,垃圾回收器会将未使用的内存释放回堆中。 虽然 Android 查找未使用内存的方式在不断改进,但对于所有 Android 版本,系统都必须在某个时间点短暂地暂停你写的代码。 大多数情况下,这些暂停难以察觉。 但是,如果你的应用分配内存的速度比系统回收内存的速度快,那么当释放足够的内存以满足应用的分配需要时,应用就可能出现延迟...

weixin_30393633的博客 742

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Rockchip平台 Android 11 到 Android 16 系统占用内存对比分析

摘要:Rockchip平台Android系统内存分析显示,从Android 11到16版本,系统内存占用持续增加49%,空闲内存从1.09GB降至651MB。内核内存需求几乎翻倍,反映系统复杂性提升,但内存管理技术从ION升级为DMA-BUF更高效。OOM阈值在Android 12后保持稳定,GPU内存管理更精细。总体呈现"功能换资源"趋势,系统功能丰富化导致内存需求增加,建议新设备使用新版系统以获得最佳体验。(150字)

weixin_43245753的博客 3056

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android native 内存分析,Android native Memory分析

本文将分析Android native memory的使用状况及通过一些手段来定位到native memory leak代码。在EngLoad上执行以下adb命令$adbshellsetproplibc.debug.malloc1$adbshellstop$adbshellstart然后等手机重新启动后,链接DDMS就可以看到每个SO文件占用的内存大小了。一般占用很大的比较可...

weixin_29112009的博客 1575

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android native heap内存占用分析

参考文章: Android Native层(C++)内存泄露诊断 2. 单抓native heap dump 先设置属性: 然后启动app并使用,然后抓dump信息: 3. 用native_heapdump_viewer.py分析 工具获取方法:  将native_heap.txt文件上传到编译平台,通过native_heapdump_viewer.py脚本解析该文件。这个脚本的大致原理呢其实就是利用addr2line将Sysmbol表与我们dunp下来的地址进行map比对,同时呢计算出每个so库所分配的内

SurpriseDPD的博客 2841

Android Studio Memory Monitor内存分析核心指标详解

本文解析了内存分析中的四个关键指标:Shallow Size(对象自身内存)、Retained Size(可释放总内存)、Native Size(本地内存)和Depth(引用层级)。通过用户详情页案例,展示了各指标的计算方法,并深入讲解了计算规则和特性。重点分析了高Retained Size、Native内存泄漏和引用过深的风险,提出了优化策略和工具验证方法。核心建议:优先优化高Retained Size对象,警惕Native内存泄漏,控制引用层级不超过7层,使用Memory Profiler和MAT等工具

猿小蔡的博客 1054
上一篇: [Android] 解析 GraphicBuffer 之 Framework 层
下一篇: 【Flutter】深入剖析TextField组件
网络安全-XG
博客等级 码龄5年 1万+粉丝 2752原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值