Theory
in java we can receive a gc notification by ReferenceQueue
when an object is recycled by jvm, Reference that hold it will be added to ReferenceQueue at the same time
so we can use Reference and ReferenceQueue to check whether an object is correctly released
Choose Solution
we choose WeakReference as the impl class, as it tells jvm to recycle object as soon as possible
we can call System.gc() to ask jvm for a gc execution, but this is not guranteed, it is just an advice
if you want trigger gc immediately, you can run a java command like this
jcmd <pid> GC.run
if you are running on an android platform, you can force a gc through Profiler tool
Profiler > New Session > Open Memory > Force Garbage Collection
Leak Check Tool
now let us achieve this tool
import java.lang.ref.ReferenceQueue
import java.lang.ref.WeakReference
import kotlin.concurrent.thread
object Leaker {
class NamedWeakReference(obj: Any, val name: String) : WeakReference<Any>(obj, queue)
private val queue = ReferenceQueue<Any>()
private val refs = mutableListOf<NamedWeakReference>()
init {
thread {
while (true) {
Thread.sleep(1000L)
val ref = queue.poll() as? NamedWeakReference
if (ref != null) {
refs.remove(ref)
println("Leaker : ${ref.name} Recycled")
}
}
}
}
fun add(obj: Any, name: String = obj.name()) {
val ref = NamedWeakReference(obj, name)
refs.add(ref)
}
private fun Any.name() = "${javaClass.simpleName}@${hashCode()}"
}
Appreciate The Masterpiece











