所以我最近正在编写程序,以确认Dijkstra互斥算法正在工作。我决定使用我不想使用C ++并自己管理内存的Kotlin coz。今天,我看到尽管我的程序按顺序运行,但所有内核都被100%使用,这是否是JVM优化?还是Kotlin优化了我的递归调用?我需要提到的是,我的递归不是尾递归。你们当中有人知道为什么会这样吗?为了清楚起见,我没有使用线程或协程。
答案 0 :(得分:1)
简短的回答:不用担心!
如果您不使用协程或显式线程,则您的代码应继续在同一线程中执行。
但是,有no guarantee,您的线程将始终在同一内核上执行;操作系统可以随时将其安排在最合适的任何内核上。 (我不知道各种操作系统可以使用哪些标准来做出这些决定,但是它很可能会考虑其他线程和进程。而且您的线程可以在代码之间快速移动,以至于使您可能做的任何监视感到困惑。)
此外,即使您不启动任何其他线程,也可能会有多个后台线程处理garbage collection,running finalisers和其他内务处理。如果使用GUI工具箱(例如JavaFX或Swing),则将使用许多线程,而框架将使用Spring。 (这些通常会被标记为“ dæmon”主题,因此它们不会阻止JVM退出。)
最后,JVM本身可能会使用系统线程来background compilation进行字节码,监视等等。 (当然,不同的JVM实现可能会有所不同。)
(顺便说一句,这些都不是Kotlin特有的;对于所有Java应用程序都是相同的。但是对于Kotlin / JS和Kotlin / native,几乎可以肯定是不同的。)
因此,不,在多个内核上进行活动并不意味着您的代码已被转换或重写。这只是意味着您不是在裸机上运行,应该信任JVM来处理一切!
答案 1 :(得分:0)
那是GC,这是我在那创建的Reddit帖子。 https://www.reddit.com/r/Kotlin/comments/bp9y1t/recursion_calls_on_different_cores/