Coroutines share threads for execution. When a runBlocking builder is called from a coroutine it blocks the underlying thread and prevents other coroutines from using this resource. This can result in performance issues and in bad cases thread starvation.
It provides a potential callstack from coroutine primitive (suspend function or builder) to runBlocking builder.
Example:
suspend fun main() {
foo()
}
fun foo() {
runBlocking { suspendFunction() }
}
Potential solution:
suspend fun main() {
foo()
}
suspend fun foo() {
suspendFunction()
}
Use the explore functions with overrides option to configure analysis for virtual functions: