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

LeakCanary is not able to find the paths to retained ojects

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

这是 Logcat 中有趣的部分:

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好像获取不到路径,奇怪... 有没有其他方法可以查看保留的对象?

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