相关文章推荐
豪气的荒野  ·  WebSocket.ReceiveAsync ...·  3 天前    · 
酷酷的柠檬  ·  c# 日志文件保留7天_c# ...·  1 月前    · 
怕老婆的柠檬  ·  win10 UWP ...·  1 年前    · 
旅途中的牛腩  ·  涨姿势了!MasterGo ...·  1 年前    · 
谦逊的书包  ·  Python类调用实例方法·  1 年前    · 

Android Studio Profiler 的Native Memory功能,只用跟踪通过 C/C++ 分配器(包括原生 JNI 对象)进行的分配,不会跟踪Java对象的分配。

由于需要操作系统的支持,只能在 Android 10及以上 的手机上才能使用。下文使用Android Studio 4.2.1来说明该功能。

Allocation Tracking的方式有:None(不跟踪Allocation)、Sampled(按统计学方法跟踪部分Allocation)和Full(跟踪所有Allocation)。

该选项只影响实时Profiler时的数据获取, Record native allocations 不受该选项影响,会抓取所有符合阈值的Native内存分配。

profiler配置

注1: Native memory sampling interval (bytes)为抓取的最小内存size,大于等于该值将被memory profiler记录

注2: 勾选“Start this recording on startup”,并选择“Native memroy activity(Requires API level >= 29)”,在launch profiler时,会自动开始Recorded Native Allocations

launch profiler

自动拉起手机上app,并开始profiler

attach profiler

手动在手机上手动启动app,如果app时 debuggable 的话,会看到该app的进程

Table -- Arrange by allocation method视图

注1: Allocations Size,Deallocations Size,Remaining Size的单位为byte

注2: !!!0000! 开头的是显存相关的分配

Table -- Arrange by callstack视图

unknown // 找不到函数符号

注1: development、debuggame、debug的libUE4.so中本身会包含大量符号,可以直接在堆栈中看到很多函数的名称

注2: test、shipping的libUE4.so在没有debug so时,绝大多数函数会找不到符号,而显示unknown

test、shipping的libUE4.so配置debug so的方法

方法①:本地打test、shipping包,然后使用Andriod Studio打开对应的ue4 Android工程,然后launch profiler或attach profiler

方法②:打开之前老的ue4 Android工程,将对应版本的debug libUE4.so拷贝到 Intermediate\Android\arm64\gradle\app\src\main\jniLibs\arm64-v8a 目录中,然后attach profiler

对于Profile APK方式,经过测试,即使配置了debug libUE4.so,test、shipping也找不到函数符号(需进一步研究)

显示调用图(Call Chart)全貌

① 一共有4个CallStack,栈顶函数分别为main、 __start_thread、unknown、ERROR 1

② 从上到下,形成一个层次结构的CallStack,上面的调用函数(Caller),下面为被调用函数(Callee),与调试器里面看到的CallStack一样

③ 鼠标放在具体的色块栈帧上,会有如下Tips信息:

焦点 切到调用图(Call Chart)上后,并将输入法切为 英文状态

充分展开后(左右方向),快捷操作是否失效 放大(左右方向) 缩小(左右方向) 水平滚动条左移 水平滚动条右移 垂直滚动条上下移 Ctrl+鼠标滚轮 以鼠标所在位置为中心,进行放大缩小(左右方向)

注1: 充分展开后(左右方向),只能通过鼠标来拖动水平滚动条进行左右移动

注2: 充分展开后(左右方向),快捷操作失效后,可通过将下拉框重新选一下“Total Remaining Size”来恢复成瀑布图全貌

在左侧列表栏的Natvie Sampled上右键,可将数据导出保存到 xxxxx.heapprofd 文件中

使用内存性能分析器查看应用的内存使用情况

Native Memory Profiling with Android Studio 4.1

python 线程中断 python线程停止后重启

join是等待线程结束,至于一个线程或是两个线程出错,要怎么重启,如果线程出错是异常,可以这样做class ExceptionThread(threading.Thread): def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None): Redirect except

在智能电网领域中,数据工程到底是如何实施的呢?本文将以IBM的Itelligent Utility Network产品为例阐述智能电网中的数据工程,它是IBM声称传统电网向智能电网转变的整体方案 前言        另一方面,如今是一个数据爆炸的时代,电力领域也不例外。随着大量高级传感器、智能量测系统投入使用,大量