title: Kotlin - Coroutines cause heavy CPU usage with DefaultDispatcher after migration to Kotlin 1.3
body: <p>I have been using the experimental versions of Kotlin coroutines under high concurrency for a long time, and the performance has always been excellent. The main logic could be simplified to the code below:</p>
  
  <pre><code>// works fine in kotlin 1.2 with 3000+ QPS for a 40-core host
  launch {
    // running in ForkJoinPool.commonPool() by default
    // non-blocking IO function
    val result = supendFunction()
    doSomething(result)
  }
  </code></pre>
  
  <p>However, after I updated kotlin to 1.3, and migrated to the formal version of coroutines, like this</p>
  
  <pre><code>// kotlin 1.3 version
  GlobalScope.launch {
    // running in DefaultDispatcher
    // non-blocking IO function
    val result = supendFunction()
    doSomething(result)
  }
  </code></pre>
  
  <p>The CPU usage rises from 2% to 50% without any exception or error thrown. The only difference that I notice is that the coroutines are no longer executed in <code>ForkJoinPool.commonPool()</code> like before. Instead, they are running in <code>DefaultDispatcher</code> threads, like <code>DefaultDispatcher-worker-30</code>.</p>
  
  <p>My questions are:</p>
  
  <ol>
  <li>Why does it cost so much CPU usage with <code>DefaultDispatcher</code>?</li>
  <li>Why does kotlin 1.3 use <code>DefaultDispatcher</code> in place of <code>ForkJoinPool.commonPool()</code> by default?</li>
  <li>How to keep the behavior of coroutines just like before 1.3?</li>
  </ol>