JVM应用程序中的许多线程是否昂贵?

时间:2012-05-08 13:56:53

标签: multithreading scala jvm actor

我目前正在学习Scala中的演员。本书建议使用react方法而不是receive,因为它允许系统使用更少的线程。

我看过why creating a thread is expensive。但是,一旦你拥有了线程(在初始化之后应该在Scala中保存actor系统)的原因是什么,将它们包含在内是否很昂贵?

主要是内存消耗吗?还是有其他原因吗?

3 个答案:

答案 0 :(得分:10)

使用多个线程可能比您预期的更昂贵,因为:

  • 每个线程占用堆外部的内存,这限制了JVM可以创建多少个线程;
  • 从一个线程切换到另一个线程会消耗一些CPU时间,因此如果您有可以在单个线程中执行的活动,则可以节省CPU周期;
  • 有JVM调度程序,如果有更多线程,还有更多工作要做。同样适用于底层OS调度程序;
  • 最后,使用比CPU内核更多的线程来处理CPU绑定任务没有多大意义,使用比I / O活动更多的I / O线程(例如,网络客户端)是没有意义的。

答案 1 :(得分:2)

除了线程周围的内存开销(可能会或可能不会很小)之外,拥有更多线程通常也意味着在需要选择哪个线程时,时间表将有更多元素要考虑接下来获得CPU。

某些操作系统/ JVM也可能对可以同时存在的线程数量有限制。

最终,这是一个小额管理费用的积累,最终可能会占很大比例。这些都不是Java特有的。

答案 2 :(得分:2)

拥有线程并不“昂贵”。当然,这有点取决于我们在这里谈论多少。我怀疑数十亿个线程会成为一个问题。我认为一般来说,拥有大量线程被认为是昂贵的,因为你可以做更多的并行工作,因此CPU上升,内存增加等等......但如果它们被正确管理(例如汇集以保护系统资源)那么没关系。 JVM不一定使用本机线程,因此Java线程不一定映射到OS本机线程(例如,查看绿色线程或轻量级线程)。在我看来,JVM中的线程没有隐含的成本。成本来自糟糕的线程管理和过度使用资源,不小心分配它们的工作。