首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LeakCanary无法找到保留对象的路径

LeakCanary无法找到保留对象的路径
EN

Stack Overflow用户
提问于 2020-11-18 23:24:53
回答 1查看 478关注 0票数 0

在使用LeakCanary搜索应用程序中的内存泄漏时,我偶然发现了一个奇怪的结果:

这是Logcat中有趣的部分:

代码语言:javascript
复制
D/LeakCanary: Found 9 objects retained, dumping heap now (app is visible & >=5 threshold)
D/LeakCanary: WRITE_EXTERNAL_STORAGE permission not granted, ignoring
D/LeakCanary: Setting up flushing for Thread[LOCATION,5,main]
D/LeakCanary: Analysis in progress, working on: PARSING_HEAP_DUMP
D/LeakCanary: Analysis in progress, working on: EXTRACTING_METADATA
D/LeakCanary: Analysis in progress, working on: FINDING_RETAINED_OBJECTS
D/LeakCanary: Setting up flushing for Thread[IntentService[HeapAnalyzerService],5,main]
D/LeakCanary: Analysis in progress, working on: FINDING_PATHS_TO_RETAINED_OBJECTS
D/LeakCanary: Found 25 retained objects
D/LeakCanary: Found 0 paths to retained objects
D/LeakCanary: Analysis in progress, working on: INSPECTING_OBJECTS
D/LeakCanary: Analysis in progress, working on: COMPUTING_NATIVE_RETAINED_SIZE
D/LeakCanary: Analysis in progress, working on: COMPUTING_RETAINED_SIZE
D/LeakCanary: Analysis in progress, working on: BUILDING_LEAK_TRACES
D/LeakCanary: Analysis in progress, working on: REPORTING_HEAP_ANALYSIS
D/LeakCanary: ​
    ====================================
    HEAP ANALYSIS RESULT
    ====================================
    0 APPLICATION LEAKS
    
    References underlined with "~~~" are likely causes.
    Learn more at https://squ.re/leaks.
    ====================================
    0 LIBRARY LEAKS
    
    A Library Leak is a leak caused by a known bug in 3rd party code that you do not have control over.
    See https://square.github.io/leakcanary/fundamentals-how-leakcanary-works/#4-categorizing-leaks
    ====================================
    METADATA
    
    Please include this in bug reports and Stack Overflow questions.
    
    Build.VERSION.SDK_INT: 29
    Build.MANUFACTURER: samsung
    LeakCanary version: 2.5
    App process name: 
    Stats: LruCache[maxSize=3000,hits=7157,misses=65789,hitRate=9%]
    RandomAccess[bytes=3638897,reads=65789,travel=66202063325,range=23021778,size=54136938]
    Analysis duration: 17316 ms
    Heap dump file path: 
    Heap dump timestamp: 1605711733381
    Heap dump duration: 1506 ms
    ====================================

看起来leakcanary无法获取路径,这很奇怪...是否有其他方法可以查看保留的对象?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 01:48:12

LeakCanary导航对象图,从所有GC根(例如静态字段)和以下引用开始。这个结果意味着LeakCanary没有找到导致实例泄漏的路径。

LeakCanary只遵循强引用而忽略弱引用,因为这些引用不应该阻止对象被垃圾收集。你可以在这里看到被忽略的引用列表:https://github.com/square/leakcanary/blob/main/shark-android/src/main/java/shark/AndroidReferenceMatchers.kt#L1159-L1236

您可以做的一件事是定制该列表,删除一些条目。请记住,LeakCanary只提供最短路径,因此可能有几条路径通过被忽略的引用。

否则,您可以使用Eclipse MAT (免费)或YourKit (最好的工具,但不是免费的):https://square.github.io/leakcanary/faq/#how-can-i-dig-beyond-the-leak-trace

另一种选择是提取堆转储,然后编写一个小的Kotlin脚本来运行分析并调整配置,直到找到您想要的:https://square.github.io/leakcanary/shark/#generating-a-heap-analysis-report

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64896082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档