日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )

發(fā)布時間:2025/6/17 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、 報錯信息
  • 二、 內(nèi)存排查
  • 三、 代碼分析及修改
  • 四、 不同版本說明



參考以下博客 :

【Android 內(nèi)存優(yōu)化】Android Profiler 工具常用功能 ( 監(jiān)測內(nèi)存 | 內(nèi)存快照 )

【Android 內(nèi)存優(yōu)化】使用 Memory Analyzer ( MAT ) 工具分析內(nèi)存 ( hprof 文件轉(zhuǎn)換 | MAT 工具下載 | MAT 工具使用 )

【Android 內(nèi)存優(yōu)化】使用 Memory Analyzer ( MAT ) 工具分析內(nèi)存 ( MAT 工具使用 | 最大對象 | 類實例個數(shù) | 引用與被引用 | GC Roots 最短鏈 )





一、 報錯信息



啟動 Profiler 調(diào)試 Android 應(yīng)用 , 點擊如下紅色選框中的按鈕 , 啟動后會自動開啟 Profiler 界面 ;


點擊 MEMORY 面板 , 即可進(jìn)入 Memory 監(jiān)控界面 , 在該界面中可以監(jiān)控內(nèi)存運行情況 ;



開始執(zhí)行時運行平穩(wěn) , 內(nèi)存一直保持在 97.4 MB 左右 ;


開啟某方法后 , 顯示某自定義組件 , 不斷循環(huán)繪制某多邊形 , 出現(xiàn)如下內(nèi)存情況 :





二、 內(nèi)存排查



點擊內(nèi)存監(jiān)控面板左上角的 Record 按鈕 , 錄制一段內(nèi)容 , 然后進(jìn)入如下界面 ;

一般情況下 , 不用多想 , 就是第一個類的對象內(nèi)存泄漏 , 這里的第一個類時 FinalizerReference 類 , 該對象創(chuàng)建了 5149 個 , 這里泄漏的內(nèi)存就是這個對象泄漏的 ;

點擊該對象 , 即可彈出右側(cè)對話框 , 顯示著創(chuàng)建的 5149 個對象的信息 ;


再次點擊右側(cè)的某個對象 , 打開該對象創(chuàng)建時的調(diào)用棧 , 查看究竟在什么地方 , 創(chuàng)建了這么多 FinalizerReference 對象 ;

發(fā)現(xiàn)是在一個自定義組件中 , 該組件的需求是根據(jù)用戶操作 , 實時顯示多邊形 , 多邊形基本是每隔 20ms , 就要重繪一次 , 這里需要在 onDraw 方法中循環(huán)處理多邊形繪制 ;





三、 代碼分析及修改



點擊上面的調(diào)用棧最上層的方法 , 在循環(huán)里出現(xiàn)不斷創(chuàng)建對象的方法 Path path = new Path() , 導(dǎo)致了內(nèi)存泄漏 ;

private void draw(){while(true){Path path = new Path();path.moveTo(x, y);path.lineTo(x1, y1);path.lineTo(x2, y2);path.close();canvas.drawPath(path, paint);} }

修改方案 : 將創(chuàng)建對象語句移動到循環(huán)外部 , 在循環(huán)中只復(fù)用對象 , 這樣內(nèi)存泄漏問題解決 ;

private void draw(){Path path = new Path();while(true){path.reset();path.moveTo(x, y);path.lineTo(x1, y1);path.lineTo(x2, y2);path.close();canvas.drawPath(path, paint);} }

總結(jié) : 不要在循環(huán)里創(chuàng)建對象 , 只能復(fù)用對象 , 或者使用已有的對象 ;


很小白的問題 , 找了好幾個小時 , 記錄下 , 吸取教訓(xùn) ;





四、 不同版本說明



上述 內(nèi)存泄漏 在 Android 10 操作系統(tǒng)中沒有 , 在 Android 7 操作系統(tǒng)中出現(xiàn) , 這個問題要注意 , 開發(fā)時要在不同版本的手機中進(jìn)行內(nèi)存性能優(yōu)化測試 ;

總結(jié)

以上是生活随笔為你收集整理的【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。