/
TestUtil.kt
95 lines (91 loc) · 2.95 KB
/
TestUtil.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package shark
import shark.ReferencePattern.InstanceFieldPattern
import shark.ReferencePattern.JavaLocalPattern
import java.io.File
import java.lang.ref.PhantomReference
import java.lang.ref.SoftReference
import java.lang.ref.WeakReference
@Suppress("UNCHECKED_CAST")
fun <T : HeapAnalysis> File.checkForLeaks(
objectInspectors: List<ObjectInspector> = emptyList(),
computeRetainedHeapSize: Boolean = false,
referenceMatchers: List<ReferenceMatcher> = defaultReferenceMatchers,
metadataExtractor: MetadataExtractor = MetadataExtractor.NO_OP,
proguardMapping: ProguardMapping? = null
): T {
val inspectors = if (ObjectInspectors.KEYED_WEAK_REFERENCE !in objectInspectors) {
objectInspectors + ObjectInspectors.KEYED_WEAK_REFERENCE
} else {
objectInspectors
}
val heapAnalyzer = HeapAnalyzer(OnAnalysisProgressListener.NO_OP)
val result = heapAnalyzer.analyze(
heapDumpFile = this,
referenceMatchers = referenceMatchers,
computeRetainedHeapSize = computeRetainedHeapSize,
objectInspectors = inspectors,
metadataExtractor = metadataExtractor,
proguardMapping = proguardMapping
)
if (result is HeapAnalysisFailure) {
println(result)
}
return result as T
}
val defaultReferenceMatchers: List<ReferenceMatcher> =
listOf(
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern(WeakReference::class.java.name, "referent")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern("leakcanary.KeyedWeakReference", "referent")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern(SoftReference::class.java.name, "referent")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern(PhantomReference::class.java.name, "referent")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern("java.lang.ref.Finalizer", "prev")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern("java.lang.ref.Finalizer", "element")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern("java.lang.ref.Finalizer", "next")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern("java.lang.ref.FinalizerReference", "prev")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern("java.lang.ref.FinalizerReference", "element")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern("java.lang.ref.FinalizerReference", "next")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern("sun.misc.Cleaner", "prev")
)
,
IgnoredReferenceMatcher(
pattern = InstanceFieldPattern("sun.misc.Cleaner", "next")
)
,
IgnoredReferenceMatcher(
pattern = JavaLocalPattern("FinalizerWatchdogDaemon")
),
IgnoredReferenceMatcher(
pattern = JavaLocalPattern("main")
)
)