0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用DevEco Studio性能調(diào)優(yōu)工具Profiler定位應(yīng)用內(nèi)存問題

HarmonyOS開發(fā)者 ? 來(lái)源:HarmonyOS開發(fā)者技術(shù) ? 2025-01-16 14:40 ? 次閱讀

鴻蒙應(yīng)用開發(fā)過程中,可能由于種種原因?qū)е聭?yīng)用內(nèi)存未被正的使用或者歸還至操作系統(tǒng),從而引發(fā)內(nèi)存異常占用、內(nèi)存泄漏等問題,最終導(dǎo)致應(yīng)用卡頓甚至崩潰,嚴(yán)重影響用戶體驗(yàn)。

DevEco Profiler是集成在DevEco Studio中的一款原生鴻蒙應(yīng)用性能優(yōu)化工具,能夠輔助開發(fā)者高效完成鴻蒙應(yīng)用的性能問題定位與優(yōu)化。在集成開發(fā)環(huán)境DevEcoStudio中可以以如下方式打開DevEco Profiler:

在DevEco Studio頂部菜單欄中選擇“View-> Tool Windows -> Profiler”。

在DevEco Studio底部工具欄中單擊“Profiler”。

按“Double Shift”或者“Ctrl+Shift+A”打開搜索功能,搜索“Profiler”。

DevEco Profiler中提供了針對(duì)鴻蒙應(yīng)用內(nèi)存問題的場(chǎng)景化分析模板SnapshotInsight與Allocation Insight,可以用于分析ArkTS以及Native內(nèi)存,幫助開發(fā)者高效定位解決內(nèi)存問題。下面將從識(shí)別問題、定界定位、優(yōu)化驗(yàn)證三個(gè)方面來(lái)對(duì)DevEcoProfiler定位內(nèi)存問題的方法進(jìn)行介紹。

識(shí)別內(nèi)存問題

1.1 監(jiān)控應(yīng)用內(nèi)存

當(dāng)應(yīng)用的某項(xiàng)功能開發(fā)完成時(shí),可以使用DevEco Profiler的實(shí)時(shí)監(jiān)控功能對(duì)應(yīng)用的各項(xiàng)資源進(jìn)行監(jiān)控,其中就包括應(yīng)用內(nèi)存資源。詳細(xì)使用方法見性能問題定界。

性能問題定界:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/realtime-monitor-V13?catalogVersion=V13

實(shí)時(shí)監(jiān)控界面所展示的是應(yīng)用在運(yùn)行過程中實(shí)際所使用的物理內(nèi)存(ProportionalSet Size, PSS)、其他進(jìn)程的物理內(nèi)存占用以及操作系統(tǒng)的空閑內(nèi)存,泳道的藍(lán)色部分展示了當(dāng)前進(jìn)程的物理內(nèi)存占用情況及趨勢(shì),左側(cè)餅圖則展示了當(dāng)前時(shí)刻的瞬時(shí)內(nèi)存使用數(shù)據(jù)。

af75ffd4-d328-11ef-9310-92fbcf53809c.png

此時(shí),我們可以正常地操作應(yīng)用,觀察在當(dāng)前功能運(yùn)行過程中的應(yīng)用內(nèi)存變化情況,初步判斷是否存在內(nèi)存問題。當(dāng)發(fā)現(xiàn)在一段時(shí)間內(nèi)應(yīng)用內(nèi)存沒有明顯增加或者在內(nèi)存上漲后又逐漸回落至正常水平,則基本可以排除應(yīng)用存在內(nèi)存問題;反之,如果應(yīng)用內(nèi)存占用明顯與預(yù)期值不符合、在一段時(shí)間內(nèi)不斷上漲且無(wú)回落或者內(nèi)存占用明顯增長(zhǎng)超出預(yù)期,那么則可初步判斷應(yīng)用可能存在內(nèi)存問題,需要進(jìn)一步分析。

1.2 初步定界內(nèi)存問題

當(dāng)從實(shí)時(shí)監(jiān)控頁(yè)面初步判斷應(yīng)用可能存在內(nèi)存問題的時(shí)候,進(jìn)一步地可以使用AllocationInsight或Snapshot Insight的Memory泳道來(lái)抓取應(yīng)用內(nèi)存在問題場(chǎng)景下的詳細(xì)數(shù)據(jù)以及變化趨勢(shì),初步定界問題出現(xiàn)的位置(NativeHeap/ArkTS Heap/dev段等)。

在當(dāng)前步驟下,錄制內(nèi)存數(shù)據(jù)時(shí)需要將Allocation Insight或SnapshotInsight中的其余泳道去除勾選,僅錄制Memory泳道的數(shù)據(jù)(注:因?yàn)槠溆嘤镜罆?huì)開啟對(duì)內(nèi)存分配、內(nèi)存對(duì)象等數(shù)據(jù)的抓取,這些功能會(huì)帶來(lái)額外的開銷,可能會(huì)對(duì)我們初步定界問題產(chǎn)生噪音,影響分析,故先排除錄制)。

af8d774a-d328-11ef-9310-92fbcf53809c.png

在Memory泳道的錄制過程中,不斷操作應(yīng)用在問題場(chǎng)景的功能,將問題放大,便于快速定界問題點(diǎn),參考錄制過程中的應(yīng)用內(nèi)存占用曲線,當(dāng)曲線的上漲幅度達(dá)到一定大小時(shí)即可結(jié)束錄制。

錄制完成后,可以展開Memory泳道,查看應(yīng)用內(nèi)存分段的使用情況,也可以點(diǎn)擊泳道上的options下拉框,自行選擇想要關(guān)注變化情況的內(nèi)存類型。

afaec904-d328-11ef-9310-92fbcf53809c.png

同時(shí),可以選中Memory泳道或其任一子泳道(直接選中泳道時(shí)詳情區(qū)域會(huì)展示完整的泳道數(shù)據(jù))來(lái)查看在每個(gè)采樣點(diǎn)的詳細(xì)應(yīng)用內(nèi)存占用數(shù)據(jù)(注:詳情區(qū)域數(shù)據(jù)采用PSS的維度衡量,數(shù)據(jù)近似于使用`hidumper --mem $pid`的第一列PSS值)。當(dāng)鼠標(biāo)左鍵單擊選中表格中某一行的數(shù)據(jù)時(shí),對(duì)應(yīng)的泳道上將展示出當(dāng)前的時(shí)間刻度線,方便快速定位內(nèi)存變化的時(shí)間位置。

afc0f746-d328-11ef-9310-92fbcf53809c.png

通過查看Memory的子泳道內(nèi)存分類以及詳情區(qū)域的內(nèi)存詳細(xì)占用,我們能夠大致定界出有哪些位置的內(nèi)存可能存在問題。例如上圖中從Memory的子泳道數(shù)據(jù)圖中可以看到,F(xiàn)ilePageOther/Native Heap/ArkTS Heap均有較大的增長(zhǎng),因而可以以這三個(gè)方面的內(nèi)存使用作為切入點(diǎn),來(lái)進(jìn)一步分析問題的根因。

定位內(nèi)存問題

從1.2節(jié)中的分析可知,當(dāng)前應(yīng)用內(nèi)存的增長(zhǎng)主要集中在FilePage Other/NativeHeap/ArkTS Heap這三個(gè)部分,那么需要使用進(jìn)一步的分析方法對(duì)這三個(gè)方面的內(nèi)存進(jìn)行分析,定位內(nèi)存上漲的根因。

在分析鴻蒙應(yīng)用的內(nèi)存問題時(shí),可以將鴻蒙應(yīng)用的內(nèi)存大體分為兩部分,方舟虛擬機(jī)內(nèi)存和Native內(nèi)存:

1. 方舟虛擬機(jī)內(nèi)存:由方舟虛擬機(jī)管控的應(yīng)用內(nèi)存,同其他的虛擬機(jī)內(nèi)存(例如Java)管理策略相似,開發(fā)者可以使用并操控的內(nèi)存基本集中于虛擬機(jī)堆上,在方舟虛擬機(jī)上被稱作ArkTSHeap,這部分內(nèi)存受到方舟虛擬機(jī)的管控。

2. Native內(nèi)存:這部分內(nèi)存主要是應(yīng)用使用到的一些涉及Native的API所申請(qǐng)的內(nèi)存以及開發(fā)者自己的Native代碼所申請(qǐng)使用的堆內(nèi)存(通常是C/C++),這部分內(nèi)存需要開發(fā)者自己去管理申請(qǐng)和釋放。

因?yàn)閮煞N內(nèi)存的使用方式和管理方式不盡相同,因此在對(duì)這兩類內(nèi)存的分析過程中所使用的方法也有比較大的區(qū)別,下面將從這兩個(gè)方面分別介紹分析方法。

2.1 ArkTS內(nèi)存問題

2.1.1 ArkTS內(nèi)存管理

首先針對(duì)ArkTS Heap,由于該部分堆內(nèi)存受到方舟虛擬機(jī)的管理,可以對(duì)堆內(nèi)存進(jìn)行垃圾回收(GarbageCollect,GC)和拍攝快照(HeapSnapshot或HeapDump,簡(jiǎn)稱dump)以反映出瞬時(shí)的全量堆內(nèi)存使用及分布情況,因此這部分內(nèi)存的問題分析手段主要是對(duì)堆dump進(jìn)行引用關(guān)系分析,分析泄漏對(duì)象無(wú)法被GC回收的原因。

不同于引用計(jì)數(shù)算法,方舟虛擬機(jī)采用可達(dá)性分析的機(jī)制來(lái)管理對(duì)象是否可被垃圾收集器回收,因此針對(duì)方舟虛擬機(jī)內(nèi)存的分析方法主要集中于對(duì)象的引用分析,即分析哪些對(duì)象引用關(guān)系是錯(cuò)誤的或者異常的,從而導(dǎo)致了泄漏對(duì)象被長(zhǎng)時(shí)間持有無(wú)法被GC,最終通過解除強(qiáng)引用關(guān)系的手段來(lái)解決內(nèi)存泄露問題。如下圖1所示,藍(lán)色的對(duì)象節(jié)點(diǎn)表示在內(nèi)存引用分析中該對(duì)象GCRoot引用可達(dá),其余對(duì)象GC Root引用不可達(dá),引用不可達(dá)的對(duì)象在GC中可以被虛擬機(jī)回收。

afe36222-d328-11ef-9310-92fbcf53809c.png

圖1 對(duì)象可達(dá)性分析

2.1.2 ArkTSHeap分析

針對(duì)虛擬機(jī)的內(nèi)存問題分析通常都集中在對(duì)dump的對(duì)象分布及引用關(guān)系的分析上,方舟虛擬機(jī)也不例外,這里在DevEcoProfiler上提供了Snapshot Insight來(lái)對(duì)方舟虛擬機(jī)的堆內(nèi)存進(jìn)行分析。

b001b25e-d328-11ef-9310-92fbcf53809c.png

在使用Snapshot分析時(shí),通常會(huì)使用三快照技術(shù)(Three Snapshot Technique),通過內(nèi)存快照的對(duì)比視圖將某兩次快照之間分配且仍然駐留的內(nèi)存篩選出來(lái),這些對(duì)象中的一部分就可能是導(dǎo)致內(nèi)存泄漏的對(duì)象。通用的流程為:

打開應(yīng)用,初始化場(chǎng)景(觸發(fā)GC)-> 拍攝第一次Snapshot作為基準(zhǔn) -> 多(N)次觸發(fā)內(nèi)存泄漏操作 -> 拍攝第二次堆快照 -> 觸發(fā)主動(dòng)GC-> 拍攝第三次堆快照

由于方舟虛擬機(jī)提供了在獲取堆快照之前自動(dòng)GC的功能,因此我們可以將上述流程簡(jiǎn)化為兩步,同時(shí)加上Profiler的錄制功能,整體流程為:

打開應(yīng)用,初始化場(chǎng)景-> 開啟錄制Snapshot Insight-> 拍攝第一次Snapshot作為基準(zhǔn) -> 多(N)次觸發(fā)內(nèi)存泄漏操作 -> 拍攝第二次堆快照-> 結(jié)束錄制

錄制完成后,會(huì)得到如下圖所示的數(shù)據(jù)

b019a44a-d328-11ef-9310-92fbcf53809c.png

錄制過程中,我們采集了兩次堆快照,對(duì)應(yīng)在Profiler的界面上就是兩個(gè)紫色的條塊,每一個(gè)條塊內(nèi)的數(shù)據(jù)都是當(dāng)前的虛擬機(jī)堆快照。條塊上的數(shù)字大小代表的是虛擬機(jī)堆內(nèi)存的實(shí)際占用。

由于在每次拍攝堆快照之前,虛擬機(jī)都會(huì)觸發(fā)GC,所以理論上堆快照內(nèi)存在的對(duì)象都是當(dāng)前虛擬機(jī)已經(jīng)無(wú)法GC掉的對(duì)象,所以我們可以將兩個(gè)堆快照進(jìn)行比較,來(lái)查看哪些對(duì)象是我們?cè)谟|發(fā)問題場(chǎng)景時(shí)新增了且不能釋放的。

b02cf18a-d328-11ef-9310-92fbcf53809c.png

點(diǎn)擊Snapshot Insight面板的Comparison頁(yè)簽,將兩次Snapshot進(jìn)行比較,如下圖。圖中數(shù)據(jù)的含義為以Snapshot2作為基準(zhǔn),Snapshot2對(duì)比Snapshot1的數(shù)據(jù)變化量。

即便是比較視圖,東西也非常多,怎么分析呢?

還記得上面說(shuō)的操作N次嗎,在觸發(fā)內(nèi)存問題場(chǎng)景時(shí)將問題觸發(fā)N次,在比較視圖中首先就去找與N強(qiáng)相關(guān)、與業(yè)務(wù)代碼強(qiáng)相關(guān)的constructor,首先來(lái)分析這些對(duì)象是否正常。

首先介紹一下Snapshot比較視圖中各項(xiàng)數(shù)據(jù)的含義,如下圖,更加具體的也可以參考內(nèi)存泄露分析或者使用Snapshot Insight分析ArkTS內(nèi)存問題。

內(nèi)存泄漏分析:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-insight-session-snapshot-V13?catalogVersion=V13

使用Snapshot Insight分析ArkTS內(nèi)存問題:https://developer.huawei.com/consumer/cn/forum/topic/0207154775311720043?fid=0109140870620153026

b046c39e-d328-11ef-9310-92fbcf53809c.png

在找到相關(guān)的業(yè)務(wù)關(guān)聯(lián)的對(duì)象后,可以從references里面一層層去尋找、排查在引用鏈上的可疑對(duì)象(一般指與業(yè)務(wù)代碼關(guān)聯(lián)的對(duì)象,尤其是xxx in com.xxx.yyy這種明顯是業(yè)務(wù)使用到的對(duì)象的位置)。

在排查時(shí),可以主要往兩個(gè)方向:

1)Distance逐漸減小;

2)引用鏈上都是業(yè)務(wù)相關(guān)的對(duì)象。

從這兩個(gè)維度去分析入度引用鏈,找出那些業(yè)務(wù)邏輯上應(yīng)該釋放但是實(shí)際并沒有釋放的對(duì)象及其引用關(guān)系,從這些引用關(guān)系上來(lái)排查是否有不合理的強(qiáng)引用導(dǎo)致的內(nèi)存無(wú)法釋放的問題,進(jìn)而解決內(nèi)存泄漏問題。

具體的案例可以參考:使用SnapshotInsight分析ArkTS內(nèi)存問題

使用Snapshot Insight分析ArkTS內(nèi)存問題:https://developer.huawei.com/consumer/cn/forum/topic/0207154775311720043?fid=0109140870620153026

2.2 分析Native內(nèi)存

其次針對(duì)Native Heap,由于該部分堆內(nèi)存僅由開發(fā)者自行控制分配釋放,無(wú)法使用類似虛擬機(jī)的dump手段來(lái)分析整體的堆內(nèi)存使用情況,僅可使用Profiler抓取到錄制過程中的應(yīng)用內(nèi)存分配和釋放事件,因此需要開發(fā)者通過內(nèi)存分配/釋放事件以及內(nèi)存分配棧等信息自行找到代碼中的內(nèi)存申請(qǐng)和釋放點(diǎn)來(lái)確認(rèn)是否存在申請(qǐng)、釋放不配對(duì)導(dǎo)致的內(nèi)存泄漏問題。

內(nèi)存分析模板Allocation提供了該能力,使用該模板可以抓取到經(jīng)由系統(tǒng)基礎(chǔ)庫(kù)分配的Native部分內(nèi)存,分析分配/釋放的匹配邏輯,界面如下圖。

b059a108-d328-11ef-9310-92fbcf53809c.png

在開始錄制前,需要先了解一些該模板的工作原理以及相關(guān)的配置參數(shù),以確定能夠抓取到應(yīng)用中可能存在的內(nèi)存問題。

Allocation模板通過hook基礎(chǔ)庫(kù)中的某些函數(shù)調(diào)用來(lái)獲取每次內(nèi)存分配的數(shù)據(jù),并將這些數(shù)據(jù)返回至Profiler中,在Profiler中完整的展示這些內(nèi)存的分配、釋放數(shù)據(jù)以及相關(guān)的調(diào)用棧、庫(kù)等信息。詳細(xì)的使用介紹可以參考這里內(nèi)存分析及優(yōu)化,下面就具體的使用流程做介紹。

內(nèi)存分析及優(yōu)化:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-insight-session-allocations-memory-V13?catalogVersion=V13

2.2.1Native數(shù)據(jù)采集

首先,是錄制前的參數(shù)配置,最新版本的配置頁(yè)面如下,其中的配置項(xiàng)都是針對(duì)NativeAllocation這條泳道的,下面依次介紹:

1)Statistics Mode、Sampling Interval:該項(xiàng)配置代表是否開啟統(tǒng)計(jì)模式采集數(shù)據(jù),默認(rèn)開啟。開啟后,數(shù)據(jù)會(huì)每隔SamplingInterval中設(shè)置的時(shí)間從設(shè)備端匯總并返回,該模式下工具的采集性能會(huì)更好、負(fù)載更低、可采集的時(shí)間也更長(zhǎng),但是會(huì)丟失掉精準(zhǔn)的每次分配釋放的內(nèi)存信息;關(guān)閉該模式,會(huì)開啟詳情采集模式,返回的數(shù)據(jù)中會(huì)給出每次內(nèi)存分配的詳細(xì)情況,包含內(nèi)存分配地址、分配大小、分配棧等信息。推薦使用統(tǒng)計(jì)模式,如業(yè)務(wù)側(cè)有需要也可酌情使用詳情模式。

2)Filter Size:過濾內(nèi)存大小。該參數(shù)表示最小抓取的內(nèi)存大小,默認(rèn)為1024bytes(1kb),內(nèi)存分配時(shí)小于該大小的內(nèi)存分配信息不會(huì)被抓取到,應(yīng)用可根據(jù)自身具體情況選擇該參數(shù)。該參數(shù)可能會(huì)顯著影響應(yīng)用性能,當(dāng)該值過小且應(yīng)用在分配大量?jī)?nèi)存的場(chǎng)景時(shí)(抓取的內(nèi)存分配數(shù)據(jù)量巨大)可能會(huì)造成應(yīng)用卡頓,因此建議選擇合適的參數(shù)。

3)Backtrace Mode:內(nèi)存分配?;貤7绞?,默認(rèn)FP回棧。FP回棧性能更好,默認(rèn)開啟,但在某些特定場(chǎng)景下(例如so的編譯參數(shù)控制),F(xiàn)P回??赡苁?,此時(shí)可選擇DWARF回棧嘗試。

4)Record JS Stack:是否開啟JS回棧。當(dāng)該開關(guān)打開時(shí),系統(tǒng)回棧時(shí)會(huì)自動(dòng)從Native向JS層回棧,完成Native到JS的??p合,適合ArkTS/JS代碼調(diào)用Native的場(chǎng)景。

5)JS Backtrace Depth、Native Backtrace Depth:內(nèi)存回棧深度。代表最大的回棧層數(shù),層數(shù)越大對(duì)性能開銷越大,可結(jié)合業(yè)務(wù)動(dòng)態(tài)調(diào)整。

注:當(dāng)選擇了DWARF回棧后,JS和Native的回棧深度會(huì)變成一個(gè)框Backtrace Stack,其層數(shù)代表著JS與Native的共同回棧深度。

b06c9858-d328-11ef-9310-92fbcf53809c.png

做好配置后,可以開始抓取問題場(chǎng)景的數(shù)據(jù),切記需要在保存數(shù)據(jù)并開啟錄制之后,操作應(yīng)用復(fù)現(xiàn)問題場(chǎng)景,并在問題復(fù)現(xiàn)完成后停止錄制。(注:如果是使用統(tǒng)計(jì)模式,錄制的結(jié)束時(shí)間需要是SamplingInterval即采集周期的整數(shù)倍,例如當(dāng)采集周期是10s時(shí),停止時(shí)間建議在11s+/21s+/31s+,以此類推,留出余量給系統(tǒng)做數(shù)據(jù)處理與傳輸)。錄制完成后界面類似下圖。

b085cde6-d328-11ef-9310-92fbcf53809c.png

其中泳道部分展示了當(dāng)前的內(nèi)存變化情況,Native Allocation泳道下方又涉及兩個(gè)子泳道AllHeap和All Anonymous VM,這兩個(gè)泳道分別代表使用malloc和mmap函數(shù)分配的內(nèi)存情況,下方的詳情區(qū)域展示對(duì)應(yīng)泳道的內(nèi)存分配統(tǒng)計(jì)數(shù)據(jù)(Statistics頁(yè)簽)與內(nèi)存分配棧(CallTrees)信息。

2.2.2Native數(shù)據(jù)分析

抓取到了問題場(chǎng)景的數(shù)據(jù),接下來(lái)就是對(duì)問題數(shù)據(jù)的分析。

首先,框選范圍內(nèi)的數(shù)據(jù)展示的是:在框選范圍的起點(diǎn)之后及在框選范圍的終點(diǎn)之前的所有內(nèi)存分配的數(shù)據(jù),這個(gè)邏輯很重要,會(huì)對(duì)分析結(jié)論有很大影響,需重點(diǎn)關(guān)注。

接下來(lái),在詳情面板的左下角有一個(gè)下拉單選框,能夠篩選當(dāng)前詳情區(qū)域展示的內(nèi)存的數(shù)據(jù),如下圖所示:

1)All Allocations:框選的時(shí)間段的所有分配內(nèi)存信息。

2)Created & Existing:在框選范圍的起點(diǎn)之后分配的,且在框選范圍的終點(diǎn)之前沒有釋放的內(nèi)存數(shù)據(jù)。

3)Created & Released:在框選范圍的起點(diǎn)之后分配的,且在框選范圍的終點(diǎn)之前已經(jīng)釋放的內(nèi)存數(shù)據(jù)。

這三個(gè)選項(xiàng)可以根據(jù)具體的業(yè)務(wù)問題和訴求來(lái)確定。

b0b3c8e0-d328-11ef-9310-92fbcf53809c.png

第二個(gè)框中的Native Size和Native Library代表可以通過這兩個(gè)維度:大小和分配庫(kù)的信息來(lái)做統(tǒng)計(jì),一個(gè)是按照分配大小聚合、另一個(gè)是按照分配該內(nèi)存的庫(kù)來(lái)聚合。

b0cfb26c-d328-11ef-9310-92fbcf53809c.png

通過這個(gè)頁(yè)簽的統(tǒng)計(jì)信息、對(duì)未釋放的數(shù)量、大小等列排序后,能夠大致分析出內(nèi)存出現(xiàn)問題的情況以及場(chǎng)景,為分析內(nèi)存棧做一些提前準(zhǔn)備。接下來(lái)可以把數(shù)據(jù)切換到CallTrees內(nèi)存分配棧上。

b0d7620a-d328-11ef-9310-92fbcf53809c.png

該部分?jǐn)?shù)據(jù)展示了詳細(xì)的內(nèi)存分配棧信息,內(nèi)存問題一般都是在該部分通過棧幀信息找出相關(guān)的業(yè)務(wù)邏輯來(lái)定位。其中有兩個(gè)點(diǎn)需要說(shuō)明:

1)棧幀中主要為Native棧,除了應(yīng)用本身編譯的一些so及帶有部分接口信息的so信息外,其他系統(tǒng)庫(kù)部分僅展示so庫(kù)與函數(shù)偏移信息,若需要查看這部分信息,需要導(dǎo)入相應(yīng)版本的帶符號(hào)的so庫(kù)。具體參考基礎(chǔ)耗時(shí)分析中的離線符號(hào)解析小節(jié)。

基礎(chǔ)耗時(shí)分析:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-insight-session-time-V13?catalogVersion=V13

2)開啟Record JS Stack之后,部分棧幀中可能包含JS棧信息,JS棧信息一般對(duì)應(yīng)著應(yīng)用源碼,雙擊能夠跳轉(zhuǎn)到代碼行上。

注:所有Category上有高亮色的棧幀信息,都可以通過雙擊跳轉(zhuǎn)到源代碼所在的文件和代碼行上(前提是打開的工程是調(diào)優(yōu)應(yīng)用的相匹配的工程)。

b0ebf6fc-d328-11ef-9310-92fbcf53809c.png

同樣地,在分析調(diào)用棧的過程中,可以使用下方操作欄上的一系列功能,除了上述介紹過的AllAllocations篩選能力之外,在Native Allocation泳道的Call Trees頁(yè)簽中,可以通過底部的“Call Trees”和“Constraints”選擇框來(lái)過篩選和過濾內(nèi)存分配棧。

b0f8a67c-d328-11ef-9310-92fbcf53809c.png

Call Trees選擇框包含兩種過濾條件:

Separate byAllocated Size:在內(nèi)存分配棧完全相同的情況下,會(huì)按照每次分配棧申請(qǐng)的內(nèi)存大小將棧分開;

Hide SystemLibraries:隱藏內(nèi)存分配棧中的系統(tǒng)堆棧。

b10ebc82-d328-11ef-9310-92fbcf53809c.png

Constraints選擇框也包含了兩種過濾條件:

Count:根據(jù)指定的內(nèi)存申請(qǐng)次數(shù)過濾內(nèi)存分配棧信息;

Bytes:根據(jù)指定的內(nèi)存申請(qǐng)大小過濾內(nèi)存分配棧信息。

業(yè)務(wù)方可以根據(jù)自身的業(yè)務(wù)情況與具體的問題場(chǎng)景來(lái)適當(dāng)使用這些數(shù)據(jù)篩選能力,同時(shí)在下方也提供搜索功能,InvolvesSymbol Name搜索框提供了針對(duì)函數(shù)調(diào)用棧的文本搜索能力,可以快速搜索棧幀信息與so庫(kù)信息并快捷跳轉(zhuǎn)至對(duì)應(yīng)位置。

另外,若表格的樹狀圖不便于直觀看出內(nèi)存信息,可以使用Flame Chart火焰圖開關(guān),使用火焰圖的形式來(lái)分析內(nèi)存分配可能存在的問題,如下圖,火焰圖中的條塊長(zhǎng)度越長(zhǎng),代表該調(diào)用棧分配的內(nèi)存大小越大。

b1201626-d328-11ef-9310-92fbcf53809c.png

2.2.3Native內(nèi)存問題分析

在前面兩個(gè)小節(jié)介紹了整個(gè)Native Allocation的使用及分析方式,這里簡(jiǎn)單介紹具體的問題分析邏輯:

1. 錄制問題場(chǎng)景的內(nèi)存分配信息;

2. 從統(tǒng)計(jì)信息及內(nèi)存分配棧查看在當(dāng)前范圍內(nèi)未釋放的內(nèi)存信息(選擇Created &Existing),通過2.2.2節(jié)中介紹的各種分析和篩選能力找出未釋放的內(nèi)存堆棧,并將該堆棧結(jié)合業(yè)務(wù)邏輯分析;

3. 若涉及ArkTS代碼對(duì)Native的調(diào)用邏輯,可開啟Record JS Stack開關(guān),將Native的內(nèi)存?;貤V罦S層,簡(jiǎn)化分析難度;

4. 通過這些問題棧幀信息映射到業(yè)務(wù)代碼中,結(jié)合問題場(chǎng)景和代碼分析為何該部分內(nèi)存未釋放,找到問題點(diǎn)。

修改及驗(yàn)證

當(dāng)經(jīng)過上述步驟的流程分析完應(yīng)用的內(nèi)存問題之后,基本上已經(jīng)可以定位到問題發(fā)生的位置及相關(guān)的代碼段,在此基礎(chǔ)上結(jié)合業(yè)務(wù)邏輯對(duì)代碼做修改,修改后重新編譯推包到真機(jī)上,在相同的場(chǎng)景下嘗試復(fù)現(xiàn)問題,并使用實(shí)時(shí)監(jiān)控或者Allocation/Snapshot模板的Memory泳道來(lái)監(jiān)測(cè)應(yīng)用內(nèi)存占用情況,以確認(rèn)問題是否還存在。

b13e8692-d328-11ef-9310-92fbcf53809c.png

總結(jié)

問題不是一朝一夕出現(xiàn)的,通常問題會(huì)在開發(fā)的過程中逐漸積累,到最終暴露出來(lái)時(shí)可能已經(jīng)涉及了多個(gè)模塊、多種邏輯,各種邏輯互相耦合,導(dǎo)致分析的難度大大增加。

這種情況下,我們建議把性能相關(guān)的工作也能做到平時(shí),在開發(fā)過程中也去關(guān)心程序的性能問題。例如,剛寫了一段很長(zhǎng)的引用關(guān)系、增加了一些注冊(cè)實(shí)例的邏輯或者做了一些組件間的變量傳遞,這種時(shí)候就可以去結(jié)合邏輯自己設(shè)想一下,會(huì)不會(huì)引發(fā)一定的性能問題,甚至可以在平時(shí)就用調(diào)優(yōu)工具來(lái)檢測(cè)一把。

這樣做到每個(gè)開發(fā)階段都保證了性能的可靠,那么在項(xiàng)目日益增大的同時(shí),性能問題也不會(huì)嚴(yán)重到離譜、無(wú)法分析。

附錄

DevEco Studio下載鏈接:https://developer.huawei.com/consumer/cn/deveco-studio/

DevEco Profiler官方指導(dǎo)文檔:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-insight-V5

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3042

    瀏覽量

    74177
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6862

    瀏覽量

    123503
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2381

    瀏覽量

    42940
  • DevEco Studio
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    1121

原文標(biāo)題:如何使用DevEco Studio性能調(diào)優(yōu)工具Profiler定位應(yīng)用內(nèi)存問題

文章出處:【微信號(hào):HarmonyOS_Dev,微信公眾號(hào):HarmonyOS開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙開發(fā)-DevEco Studio Profiler工具進(jìn)行幀率分析

    Frame Profiler概述 DevEco Studio內(nèi)置Profiler分析調(diào)優(yōu)
    發(fā)表于 01-16 19:34

    HarmonyOS實(shí)戰(zhàn)開發(fā)-內(nèi)存快照Snapshot Profiler功能使用指導(dǎo)

    DevEco Studio集成的DevEco Profiler性能調(diào)
    發(fā)表于 05-11 13:51

    HDC技術(shù)分論壇:分布式調(diào)試、調(diào)優(yōu)能力解決方案

    提供了分布式調(diào)試、調(diào)優(yōu)能力解決方案,解決開發(fā)者面臨的調(diào)試不連續(xù)、操作繁瑣、功能和性能異常難定位等眾多痛點(diǎn)問題。下面讓我們先來(lái)一睹為快。注:本文涉及的
    發(fā)表于 10-28 16:20

    HDC2021技術(shù)分論壇:分布式調(diào)試、調(diào)優(yōu)能力解決方案

    分布式應(yīng)用的調(diào)試問題,DevEco Studio提供了分布式調(diào)試、調(diào)優(yōu)能力解決方案,解決開發(fā)者面臨的調(diào)試不連續(xù)、操作繁瑣、功能和性能異常難
    發(fā)表于 11-22 17:17

    【視頻】開發(fā)工具第8期:基于DevEco的系統(tǒng)高效調(diào)優(yōu)五大法寶(一)

    本課程首先介紹了如何基于DevEco Device Tool內(nèi)置工具進(jìn)行系統(tǒng)高效調(diào)優(yōu),以及內(nèi)置調(diào)優(yōu)
    發(fā)表于 12-23 15:01

    【視頻】開發(fā)工具第9期:基于DevEco的系統(tǒng)高效調(diào)優(yōu)五大法寶(二)

    本課程首先介紹了如何基于DevEco Device Tool內(nèi)置工具進(jìn)行系統(tǒng)高效調(diào)優(yōu),以及內(nèi)置調(diào)優(yōu)
    發(fā)表于 12-23 15:08

    查收新年禮物丨DevEco Studio 3.0 Beta2發(fā)布,20個(gè)新變化詳解

    的資源。為此,DevEco Studio 3.0 Beta2版本集成了Profiler性能分析器,可以為開發(fā)者提供實(shí)時(shí)分析數(shù)據(jù),并通過圖表形式進(jìn)行呈現(xiàn),方便開發(fā)者及時(shí)了解應(yīng)用的CPU占
    發(fā)表于 01-04 11:32

    【視頻】開發(fā)工具第14期:DevEco Studio特色功能介紹(二)

    本課程介紹了DevEco studio工具中的方舟編譯、分布式調(diào)試調(diào)優(yōu)、超級(jí)終端模擬、原子化服務(wù)體檢、開發(fā)者服務(wù)中心、開發(fā)者資源中心、
    發(fā)表于 01-29 15:49

    【技術(shù)視界】鴻蒙開發(fā)套件之DevEco Profiler助您輕松分析應(yīng)用性能問題

    之一。 當(dāng)然了,這其實(shí)也給我們這些程序員指明了一條升職加薪之路,學(xué)會(huì)調(diào)優(yōu),去解決性能問題這種難題,解的多了,自然就成為團(tuán)隊(duì)技術(shù)骨干了,也希望這篇文章和我們的調(diào)優(yōu)
    發(fā)表于 09-15 15:55

    淺析HDC技術(shù)分論壇之分布式調(diào)試、調(diào)優(yōu)能力解決方案

    分布式應(yīng)用的調(diào)試問題,DevEco Studio提供了分布式調(diào)試、調(diào)優(yōu)能力解決方案,解決開發(fā)者面臨的調(diào)試不連續(xù)、操作繁瑣、功能和性能異常難
    的頭像 發(fā)表于 10-30 09:10 ?2840次閱讀
    淺析HDC技術(shù)分論壇之分布式調(diào)試、<b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>能力解決方案

    DevEco Studio 3.0 測(cè)試版來(lái)啦

    、ArkCompiler方舟編譯、模擬器、分布式調(diào)試調(diào)優(yōu)、原子化服務(wù)體檢、信息中心、漢化等功能。 一、DevEco Studio 3.0 for HarmonyOS 3.0測(cè)試版 如果
    的頭像 發(fā)表于 04-07 11:48 ?2684次閱讀
    <b class='flag-5'>DevEco</b> <b class='flag-5'>Studio</b> 3.0 測(cè)試版來(lái)啦

    【技術(shù)視界】鴻蒙開發(fā)套件之DevEco Profiler助您輕松分析應(yīng)用性能問題

    的是華為性能調(diào)優(yōu)工具專家的分享,希望能為您的應(yīng)用性能優(yōu)化帶來(lái)啟發(fā)~ 作者:shizhengtao,華為
    的頭像 發(fā)表于 09-15 12:15 ?1074次閱讀
    【技術(shù)視界】鴻蒙開發(fā)套件之<b class='flag-5'>DevEco</b> <b class='flag-5'>Profiler</b>助您輕松分析應(yīng)用<b class='flag-5'>性能</b>問題

    jvm調(diào)優(yōu)主要是調(diào)哪里

    JVM調(diào)優(yōu)主要涉及內(nèi)存管理、垃圾回收、線程管理與鎖優(yōu)化等方面。下面將詳細(xì)介紹每個(gè)方面的調(diào)優(yōu)技術(shù)和策略以及如何進(jìn)行優(yōu)化。
    的頭像 發(fā)表于 12-05 11:37 ?1587次閱讀

    jvm調(diào)優(yōu)工具有哪些

    JVM調(diào)優(yōu)是提高Java應(yīng)用程序性能的重要手段,而JVM調(diào)優(yōu)工具則是輔助開發(fā)人員進(jìn)行
    的頭像 發(fā)表于 12-05 11:44 ?1114次閱讀

    鴻蒙開發(fā)實(shí)戰(zhàn):【性能調(diào)優(yōu)組件】

    性能調(diào)優(yōu)組件包含系統(tǒng)和應(yīng)用調(diào)優(yōu)框架,旨在為開發(fā)者提供一套性能
    的頭像 發(fā)表于 03-13 15:12 ?474次閱讀
    鴻蒙開發(fā)實(shí)戰(zhàn):【<b class='flag-5'>性能</b><b class='flag-5'>調(diào)</b><b class='flag-5'>優(yōu)</b>組件】