Kotlinx.coroutines: StackOverflowError in 1.4.2

Created on 9 Dec 2020  路  4Comments  路  Source: Kotlin/kotlinx.coroutines

I faced this error in a complex project after migration from coroutines 1.3.9 to 1.4.0.

The issue also reproduces with the latest 1.4.2.

Stacktrace uses coroutines 1.4.2 & JDK 11:

Exception in thread "kotlinx.coroutines.DefaultExecutor" java.lang.StackOverflowError
    at java.base/java.lang.StringBuilder.<init>(StringBuilder.java:99)
    at java.base/java.lang.Object.toString(Object.java:246)
    at kotlinx.coroutines.ExecutorCoroutineDispatcherBase.toString(Executors.kt:151)
      ... and so on ...
      at kotlinx.coroutines.EventLoopImplBase$DelayedResumeTask.toString(EventLoop.common.kt:490)
      at java.lang.String.valueOf(String.java:2951)
      at java.lang.StringBuilder.append(StringBuilder.java:168)
      at kotlinx.coroutines.DisposeOnCancel.toString(CancellableContinuation.kt:385)
      at java.lang.String.valueOf(String.java:2951)
      at java.lang.StringBuilder.append(StringBuilder.java:168)
      at kotlinx.coroutines.CompletedContinuation.toString(Unknown Source:-1)
      at java.lang.String.valueOf(String.java:2951)
      at java.lang.StringBuilder.append(StringBuilder.java:168)
      at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl.kt:506)
      at kotlinx.coroutines.EventLoopImplBase$DelayedResumeTask.toString(EventLoop.common.kt:490)
      at java.lang.String.valueOf(String.java:2951)
      at java.lang.StringBuilder.append(StringBuilder.java:168)
      at kotlinx.coroutines.DisposeOnCancel.toString(CancellableContinuation.kt:385)
      at java.lang.String.valueOf(String.java:2951)
      at java.lang.StringBuilder.append(StringBuilder.java:168)
      at kotlinx.coroutines.CompletedContinuation.toString(Unknown Source:-1)
      at java.lang.String.valueOf(String.java:2951)
      at java.lang.StringBuilder.append(StringBuilder.java:168)
      at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl.kt:506)
      at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2053)
      at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:825)
      at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1355)
      at java.util.concurrent.Executors$DelegatedExecutorService.execute(Executors.java:687)
      at kotlinx.coroutines.ExecutorCoroutineDispatcherBase.dispatch(Executors.kt:94)
      at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:159)
      at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:362)
      at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:396)
      at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:388)
      at kotlinx.coroutines.CancellableContinuationImpl.resumeUndispatched(CancellableContinuationImpl.kt:484)
      at kotlinx.coroutines.EventLoopImplBase$DelayedResumeTask.run(EventLoop.common.kt:489)
      at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
      at kotlinx.coroutines.DefaultExecutor.run(DefaultExecutor.kt:69)
      at java.lang.Thread.run(Thread.java:834)

I can't extract a reproducer code yet.

bug

Most helpful comment

Will be fixed in 1.4.3 with this commit

All 4 comments

I'm also getting the same issue with 1.4.2. Sharing the code below and attached screenshot.

import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.util.concurrent.Executors

fun main()= runBlocking{
    val dispatcher = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()).asCoroutineDispatcher();
    repeat(100_00_00_0){
        launch(dispatcher) {
            delay(30000)
            println("Running = $it")
        }
    }
    dispatcher.close()
}

image

Will be fixed in 1.4.3 with this commit

Not sure if this is related, but I am also seeing the following StackOverflowError with 1.4.2:

kotlinx.coroutines.CoroutinesInternalError: Fatal exception in coroutines machinery for CancellableContinuation(DispatchedContinuation[Dispatchers.Main, Continuation at kotlinx.coroutines.reactive.PublisherAsFlow.collectImpl(ReactiveFlow.kt:97)@83f8ac0]){CancelledContinuation[kotlinx.coroutines.flow.internal.ChildCancelledException: Child of the scoped flow was cancelled]}@fd4c3f9. Please read KDoc to 'handleFatalException' method and report this incident to maintainers
        at kotlinx.coroutines.DispatchedTask.handleFatalException$kotlinx_coroutines_core(DispatchedTask:144)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask:115)
        at android.os.Handler.handleCallback(Handler.java:794)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:6635)
        at java.lang.reflect.Method.invoke(Method.java:-2)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

Caused by: java.lang.StackOverflowError: stack size 8MB
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:452)
        at java.lang.StringBuilder.append(StringBuilder.java:137)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CompletedContinuation.toString(Unknown:22)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.CancellableContinuationImpl.toString(CancellableContinuationImpl:506)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.ResumeOnCompletion.toString(ResumeOnCompletion:1395)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)
        at kotlinx.coroutines.DisposeOnCancel.toString(DisposeOnCancel:385)
        at java.lang.String.valueOf(String.java:2827)
        at java.lang.StringBuilder.append(StringBuilder.java:132)

Fixed in 1.4.3

Was this page helpful?
0 / 5 - 0 ratings