概述
Android
android上内存分为5个部分:
Java Heap
1. 定义:android的java虚拟机分配的内存,也就是java部分分配的,ue基本不直接写java层代码,所以大的话多数是接入的第三方SDK分配的。
2. 分析工具:android studio的 memory profiler;Android 11以上版本:Perfetto的 Java heap profiler(https://perfetto.dev/docs/data-sources/java-heap-profiler)
NativeHeap
1. 定义:C/C++层直接通过malloc、new分配的内存,ue4引擎有自己的内存分配器,Native Heap主要是第三方SDK和GPU驱动分配。
2. 分析工具:
(1) Android 10以上版本:Perfetto的 Heapprofd,性能开销低(https://perfetto.dev/docs/data-sources/native-heap-profiler)
(2) 低端机:开源项目xhook (https://github.com/iqiyi/xHook),通过 PLT (Procedure Linkage Table) 技术hook住任意函数的调用,当然就包括malloc
Code
1. 定义:定义:Code内存主要是so mmap和dex mmap,前者是native库code,后者是java库code
2. 分析工具:通过命令 adb shell cat /proc/PID/smaps > sdcard/smaps.txt 获取smaps文件,
分析smaps文件,可统计各个so库占用的code内存,以及dex内存。
Graphics
1. 定义:在 Android 系统中, Graphics 内存主要包括 EGL mtrack 和 GL mtrack 两项,高通 GPU
有 Gfx dev 这一项, mali GPU 这项内存为 0 。
2. 分析工具:
(1) 高通GPU:可以通过命令 adb shell cat /d/kgsl/proc/pid/mem 获取到详细的 Graphics 内存分配记录文件,从该文件中可以分析某个进程 Textur、 buffer 、comman 等的内存占用。
(2) UE4 Memreport:UE4 引擎在通过图形 API 创建 Texture 、 Buffer 资源时,都会计算并统计申
请的 Graphics 内存,并把这类内存归为 RHI 内存。通常统计的内存会比真正的Graphics内存要小
Unknown
1. 定义:定义:在meminfo中它指所有的匿名mmap,因为是匿名的,所以meminfo不知道是什么,就统计在unkown中,一般情况下调用mmap函数分配的内存都统计在Unkonwn内存中。
2. 分析工具:
(1) Memreport以及基于Memreport下的对比工具,统计不全,部分Unknown内存会有遗漏。
(2) LLM:通过插入各种tag来将所有待统计的内存划归到某个tag下。维护一个tag的堆栈,将fmalloc到的内存统计到当前栈顶的tag下。Llm在最底层hook了fmalloc的每一个统计,如果没有任何tag在当前栈中,那么所有内存计入在untagged这个tag下,如果在代码中插入一个基于scoped的tag,就可以把这个scope下的内存计入到该tag下。通过LLm不会遗漏任何Fmalloc分配的内存。
(3) MallocLeakDetection工具;MallocProfiler工具;FramePro工具。
最后
以上就是美满雪碧为你收集整理的UE4内存探究Android的全部内容,希望文章能够帮你解决UE4内存探究Android所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复