【问题标题】:Is having many threads in a JVM application expensive?在 JVM 应用程序中拥有许多线程会很昂贵吗?
【发布时间】:2012-05-17 00:31:44
【问题描述】:

我目前正在学习 Scala 中的演员。本书推荐使用react方法而不是receive,因为它可以让系统使用更少的线程。

我已阅读why creating a thread is expensive。但是,一旦你有了线程(在初始化之后应该为 Scala 中的 Actor 系统保留),拥有它们就会很昂贵的原因是什么?

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

【问题讨论】:

  • 请注意,这个问题是关于线程创建之后的开销,所以它不是链接问题的重复。这实际上已经在问题中说明了......

标签: multithreading scala jvm actor


【解决方案1】:

除了周围有一个线程的内存开销(可能很小也可能不小)之外,周围有更多的线程通常也意味着调度将有更多的元素需要考虑,当它需要选择哪个线程时接下来获取 CPU。

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

最终,这是小额间接费用的累积,最终可能占很大比例。而且这些都不是 Java 特有的。

【讨论】:

    【解决方案2】:

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

    • 每个线程都会消耗堆外的内存,这限制了 JVM 可以创建多少线程;
    • 从一个线程切换到另一个线程会消耗一些 CPU 时间,因此如果您有可以在单个线程中执行的活动,您将节省 CPU 周期;
    • 如果有更多线程,JVM 调度程序有更多工作要做。同样适用于底层操作系统调度程序;
    • 最后,对于 CPU 密集型任务,使用比 CPU 内核更多的线程毫无意义,使用比 I/O 活动(例如,网络客户端)更多的 I/O 线程也毫无意义。

    【讨论】:

    • 可能值得注意的是,“JVM 调度程序”注释意味着您的 GC 暂停将有所增加(因为将所有线程带到安全点需要更长的时间),在年轻一代暂停时可能更明显
    【解决方案3】:

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

    【讨论】:

    • 这是迄今为止最好的解释,所以+1。
    • 当然是“贵”。它使用内存。我相信在 64 位机器上默认是 1MB/线程。所以 1000 个线程 => 1GB。您可能有 32GB 并且不在乎,但“不贵”具有误导性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多