国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android內(nèi)存泄漏分析及檢測工具LeakCanary簡介,Android進階

這篇具有很好參考價值的文章主要介紹了Android內(nèi)存泄漏分析及檢測工具LeakCanary簡介,Android進階。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

@Synchronized override fun expectWeaklyReachable(

watchedObject: Any,

description: String

) {

if (!isEnabled()) {

return

}

removeWeaklyReachableObjects()

val key = UUID.randomUUID()

.toString()

val watchUptimeMillis = clock.uptimeMillis()

val reference =

KeyedWeakReference(watchedObject, key, description, watchUptimeMillis, queue)

SharkLog.d {

"Watching " +

(if (watchedObject is Class<*>) watchedObject.toString() else “instance of ${watchedObject.javaClass.name}”) +

(if (description.isNotEmpty()) " ($description)" else “”) +

" with key $key"

}

watchedObjects[key] = reference

checkRetainedExecutor.execute {

moveToRetained(key)

}

}

上述代碼的主要邏輯是:

  1. 移除弱可達的對象

  2. 將當前的watchedObject添加到KeyedWeakReference當中

  3. 將這個weakReference保存到數(shù)組中

  4. checkRetainedExecutor中執(zhí)行moveToRetained方法

根據(jù)removeWeaklyReachableObjects方法中原理,如果這個對象除了由ObjectWatcher所添加的WeakReference以外,沒有其他對象在引用它了,那么這個對象也就可以回收了,watchedObjects也就可以移除他了。

private fun removeWeaklyReachableObjects() {

var ref: KeyedWeakReference?

do {

ref = queue.poll() as KeyedWeakReference?

if (ref != null) {

watchedObjects.remove(ref.key)

}

} while (ref != null)

}

}

checkRetainedExecutor其實是個單例對象,里面會通過handler來延遲5s來執(zhí)行方法。如果超過5s則會觸發(fā)LeakCanary的泄漏檢測機制。5s只是個經(jīng)驗值應該,因為GC并不是實時發(fā)生,因而預留5s交給GC操作。

觸發(fā)了LeakCanary的泄漏檢測之后,則會執(zhí)行HeapDumpTriggerdumpHeap方法,在獲取到了.hprof文件之后,調(diào)用HeapAnalyzerService.runAnalysis()給出分析結(jié)果。 關(guān)于.hprof文件的分析,不是本文重點,具體可以參考hprof文件協(xié)議。其分析基本也就是根據(jù)GC Root去尋找泄漏的對象,大體流程圖如下。

android leakcanary,2024年程序員學習,android

在Android中常見的內(nèi)存泄漏

單例

單例所導致的內(nèi)存泄漏幾乎是在android開發(fā)中最為常見的內(nèi)存泄漏問題了。

public class Singleton {

private static Singleton singleton;

private Context context;

private Singleton(Context context) {

this.context = context;

}

public static Singleton getInstance(Context context) {

if (singleton == null) {

singleton = new Singleton(context);

}

return singleton;

}

}

在上面的代碼中,如果在執(zhí)行getInstance方法的時候,傳入的是activity的對象,那么該activity對象就沒法被及時回收,導致內(nèi)存泄漏,可以考慮傳入ApplicationContext,或者把context放入到方法變量中。

非靜態(tài)內(nèi)部類(包括匿名內(nèi)部類)

非靜態(tài)內(nèi)部類會默認持有外部類的引用,如果它的生命周期長于外部類時,就會導致內(nèi)存泄漏。 在android開發(fā),這種情況常常見于Handler的使用。

盡可能避免使用靜態(tài)變量

class MainActivity : AppCompatActivity() {

companion object {

@JvmStatic

private var info: StaticInfo? = null

}

override fun onCreate(savedInstanceState: Bundle?) {

info = StaticInfo(this)

}

class StaticInfo(activity: MainActivity) {

}

在上述代碼中,info是一個靜態(tài)變量,但是它持有了activity的引用,由于靜態(tài)變量的生命周期要比activity的生命周期長,導致activity無法及時回收,造成內(nèi)存泄漏。

資源未關(guān)閉造成的內(nèi)存泄漏

諸如cursor、inputStream等對象一定要注意及時關(guān)閉

try {

}catch (e:Exception) {

}finally {

// 可以在finally方法里把cursor等對象進行關(guān)閉

}

集合中的對象未及時清理造成的內(nèi)存泄漏

val list = ArrayList()

例如,如果一個list中存放的是activity對象,就會可能導致activity無法及時回收。如果該list是靜態(tài)對象的話,不及時移除activity的話,就更會產(chǎn)生內(nèi)存泄漏了。

webview造成的內(nèi)存泄漏

因為webview在加載完網(wǎng)頁后,它的callback會持有activity的引用,造成webview的內(nèi)存無法釋放??梢栽赼ctivity的onDestroy()方法中移除該webview,并調(diào)用webview.destroy()。

未取消注冊或回調(diào)造成的內(nèi)存泄漏

在android中回調(diào)是使用非常多的,但如果在注冊回調(diào)的時候,傳入了context對象,則需要注 意及時取消回調(diào),否則就可能會出現(xiàn)內(nèi)存泄漏。例如eventbus和廣播。

內(nèi)存優(yōu)化

  • 使用intentService代替Service,或者service執(zhí)行完記得及時停止

  • 在系統(tǒng)資源緊張的時候,盡可能多釋放一些非重要的資源(如圖片的內(nèi)存緩存)

class MyApp : Application() {

override fun onTrimMemory(level: Int) {

super.onTrimMemory(level)

// 可以在這里做些內(nèi)存釋放的工作

}

}

  • 避免bitmap的濫用

如果不是必須操作bitmap,對于圖片加載,我們可以使用一些優(yōu)秀的第三方庫來進行加載。使用bitmap記得復用和及時回收。

  • 使用針對內(nèi)存優(yōu)化過的數(shù)據(jù)容器

在大多數(shù)場景下,可以使用SparseArray代替HashMap等可以一定程度上減少內(nèi)存使用。

  • 使用多進程

自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進入阿里一直到現(xiàn)在。

深知大多數(shù)初中級安卓工程師,想要提升技能,往往是自己摸索成長,但自己不成體系的自學效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!

因此收集整理了一份《2024年最新Android移動開發(fā)全套學習資料》送給大家,初衷也很簡單,就是希望能夠幫助到想自學提升又不知道該從何學起的朋友,同時減輕大家的負擔。
android leakcanary,2024年程序員學習,android
android leakcanary,2024年程序員學習,android
android leakcanary,2024年程序員學習,android
android leakcanary,2024年程序員學習,android

由于文件比較大,這里只是將部分目錄截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學習筆記、源碼講義、實戰(zhàn)項目、講解視頻
如果你覺得這些內(nèi)容對你有幫助,可以添加下面V無償領?。。▊渥ndroid)
android leakcanary,2024年程序員學習,android

總結(jié)

首先是感覺自己的基礎還是不夠吧,大廠好像都喜歡問這些底層原理。

另外一部分原因在于資料也還沒有看完,一面時憑借那份資料考前突擊惡補個幾天居然也能輕松應對(在這里還是要感謝那份資料,真的牛),于是自我感覺良好,資料就沒有怎么深究下去了。

之前的準備只涉及了Java、Android、計網(wǎng)、數(shù)據(jù)結(jié)構(gòu)與算法這些方面,面對面試官對其他基礎課程的考察顯得捉襟見肘。

下一步還是要查漏補缺,進行針對性復習。

最后的最后,那套資料這次一定要全部看完,是真的太全面了,各個知識點都涵蓋了,幾乎我面試遇到的所有問題的知識點這里面都有!在這里也免費分享給大家,希望大家不要犯和我一樣的錯誤呀?。?!一定要看完!
android leakcanary,2024年程序員學習,android

android leakcanary,2024年程序員學習,android

android leakcanary,2024年程序員學習,android
獲取方式:點擊我的GitHub

d、計網(wǎng)、數(shù)據(jù)結(jié)構(gòu)與算法這些方面,面對面試官對其他基礎課程的考察顯得捉襟見肘。

下一步還是要查漏補缺,進行針對性復習。

最后的最后,那套資料這次一定要全部看完,是真的太全面了,各個知識點都涵蓋了,幾乎我面試遇到的所有問題的知識點這里面都有!在這里也免費分享給大家,希望大家不要犯和我一樣的錯誤呀?。。∫欢ㄒ赐?!
[外鏈圖片轉(zhuǎn)存中…(img-xIPHanw0-1711046455617)]

[外鏈圖片轉(zhuǎn)存中…(img-r5jSmCJT-1711046455617)]

[外鏈圖片轉(zhuǎn)存中…(img-58xIsvt7-1711046455618)]
獲取方式:點擊我的GitHub文章來源地址http://www.zghlxwxcb.cn/news/detail-857767.html

到了這里,關(guān)于Android內(nèi)存泄漏分析及檢測工具LeakCanary簡介,Android進階的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • android 如何進行內(nèi)存泄漏檢測及解決方法

    內(nèi)存泄漏是在Android開發(fā)中常見的問題之一,它可能導致應用的內(nèi)存占用逐漸增加,最終影響應用的性能和穩(wěn)定性。以下是一些常見的方法來進行內(nèi)存泄漏檢測和解決: 1. 使用工具進行內(nèi)存泄漏檢測: Android Profiler: Android Studio提供的Android Profiler工具可以幫助您監(jiān)視應用的內(nèi)

    2024年02月07日
    瀏覽(41)
  • 【Android】一個contentResolver引起的內(nèi)存泄漏問題分析

    長時間的壓力測試后,系統(tǒng)發(fā)生了重啟,報錯log如下 JNI ERROR (app bug): global reference table overflow (max=51200) global reference table overflow的log 08-08 04:11:53.052912 ??973 ?3243 F zygote64: indirect_reference_table.cc:256] JNI ERROR (app bug): global reference table overflow (max=51200) 08-08 04:11:53.053014 ??973 ?3243 F z

    2024年02月08日
    瀏覽(25)
  • jvm內(nèi)存溢出排查(使用idea自帶的內(nèi)存泄漏分析工具)

    jvm內(nèi)存溢出排查(使用idea自帶的內(nèi)存泄漏分析工具)

    想分析堆內(nèi)存溢出,一定在運行jar包時就寫上參數(shù) -XX:+HeapDumpOnOutOfMemoryError ,可以看我之前關(guān)于如何運行jar包的文章。若你沒有寫??梢詫懮蠀?shù),重啟你的項目,等你的項目發(fā)生下一次堆內(nèi)存溢出異常,在運行的同級文件夾,將產(chǎn)生類似這樣一個文件 java_pid74935.hprof ,若你

    2024年02月09日
    瀏覽(30)
  • 內(nèi)存泄漏檢測方式

    內(nèi)存泄漏檢測方式

    一 、 日志記錄 ????????通過宏定義重載了 malloc 和 free 函數(shù),以在分配和釋放內(nèi)存的時候記錄一些信息,包括文件名和行號,并將這些信息寫入到相應的文件中。然后在 main 函數(shù)中演示了使用這些宏進行內(nèi)存分配和釋放。 _malloc 函數(shù): 在分配內(nèi)存之后,創(chuàng)建一個文件名,

    2024年01月17日
    瀏覽(22)
  • 項目性能優(yōu)化-內(nèi)存泄漏檢測與修改

    項目性能優(yōu)化-內(nèi)存泄漏檢測與修改

    最近終于有空優(yōu)化一波項目的性能了,第一波借助Android Studio自帶的Profiler工具檢測內(nèi)存泄漏。 右側(cè)帶有綠色原點的就是此時運行的Profiler的SESSION,點擊右側(cè)MEMORY進入內(nèi)存監(jiān)控的詳情模塊 第三步中抓取一段時間后,會自動停止,并打開Heap Dump文件 可以看到抓取到2個會導致內(nèi)存

    2024年02月11日
    瀏覽(30)
  • iOS 內(nèi)存泄漏檢測 Instruments Leaks

    iOS 內(nèi)存泄漏檢測 Instruments Leaks

    Xcode 中 按住 command + I 或者菜單欄 Product – Profile 2. 雙擊 Leaks 或者按 choose,打開 Leaks 面板 3. 在顯示的 Leaks 面板中,點擊左上角紅色點,即可運行內(nèi)存檢測。 4. 在運行過程中如果發(fā)現(xiàn)Leak Checks(如圖)出現(xiàn)紅色X說明檢測到內(nèi)存泄露,將鼠標點擊Leak Checks,在下方即可看到內(nèi)存

    2024年02月01日
    瀏覽(29)
  • 手寫C語言的內(nèi)存泄漏檢測組件

    CC++語言中,??臻g有大小限制,所以程序員可以使用堆空間的內(nèi)存。堆空間的內(nèi)存是程序員自己申請的,需要程序員自己去調(diào)用釋放的操作。內(nèi)存管理是CC++程序員必須要注意的問題,其中包括了內(nèi)存泄漏,內(nèi)存泄漏的原因是程序中申請的內(nèi)存沒有進行釋放,來看下面的例子

    2024年02月03日
    瀏覽(20)
  • Python中的內(nèi)存泄漏及其檢測方法

    一、引言 內(nèi)存泄漏是編程中常見的問題之一,它會導致程序在運行過程中不斷消耗內(nèi)存,最終可能導致程序崩潰或性能下降。在Python中,內(nèi)存泄漏也是一個需要關(guān)注的問題。本文將詳細介紹Python中的內(nèi)存泄漏及其檢測方法,以幫助讀者更好地理解和解決這個問題。 二、Pyth

    2024年02月22日
    瀏覽(26)
  • Android之內(nèi)存泄漏與內(nèi)存溢出

    Android之內(nèi)存泄漏與內(nèi)存溢出

    內(nèi)存泄漏(memory leak):是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間,導致系統(tǒng)無法及時回收內(nèi)存并且分配給其他進程使用。通常少次數(shù)的內(nèi)存無法及時回收并不會到程序造成什么影響,但是如果在內(nèi)存本身就比較少獲取多次導致內(nèi)存無法正?;厥諘r,就會導致內(nèi)存

    2024年02月13日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包