首页 > 解决方案 > 除了 CPU 和内存,线程还竞争哪些资源

问题描述

在Brian Goetz 等人的《 Java Concurrency in Practice 》一书中:

如果线程池太大,那么线程会争夺稀缺的 CPU 和内存资源,从而导致更高的内存使用率和可能的资源耗尽。如果它太小,吞吐量会受到影响,因为尽管有可用的工作,但处理器仍处于未使用状态。

这意味着如果我们在线程池中创建了太多的线程对象,那么它们会消耗太多的内存。另外,如果我们有太多线程(例如 10 个 CPU 内核的 1000 个线程,有 1000 个任务提交到线程池),那么每个任务将被分配到一个内核但可能在它完成之前被抢占,然后另一个任务将分配给核心。因此,由于抢先式调度,每个任务可能都需要很长时间才能完成。

线程是否有其他资源正在竞争?

标签: javamultithreading

解决方案


在 Java 线程堆栈的情况下,我不能 100% 确定,但在 Linux 下,如果分配了内存,它会使用共享零页进行初始化。并且实际上没有使用页框(物理内存)。只有当一个线程想要写入零页时,才会出现页面错误并且实际分配了页框(写入时复制)。

因此,如果一个线程不使用它的大部分堆栈,它应该消耗很少的内存。当然,在最坏的情况下,每个线程都可能消耗其所有堆栈,因此会消耗大量内存。

如果您有 CPU 密集型任务,那么您可能不想拥有比 CPU 内核更多的任务。否则,您将浪费时间在上下文切换(包括冷缓存)、TLB 未命中等后果上。

关于资源:有太多太多提及。


推荐阅读