java - 除了 CPU 和内存,线程还竞争哪些资源
问题描述
在Brian Goetz 等人的《 Java Concurrency in Practice 》一书中:
如果线程池太大,那么线程会争夺稀缺的 CPU 和内存资源,从而导致更高的内存使用率和可能的资源耗尽。如果它太小,吞吐量会受到影响,因为尽管有可用的工作,但处理器仍处于未使用状态。
这意味着如果我们在线程池中创建了太多的线程对象,那么它们会消耗太多的内存。另外,如果我们有太多线程(例如 10 个 CPU 内核的 1000 个线程,有 1000 个任务提交到线程池),那么每个任务将被分配到一个内核但可能在它完成之前被抢占,然后另一个任务将分配给核心。因此,由于抢先式调度,每个任务可能都需要很长时间才能完成。
线程是否有其他资源正在竞争?
解决方案
在 Java 线程堆栈的情况下,我不能 100% 确定,但在 Linux 下,如果分配了内存,它会使用共享零页进行初始化。并且实际上没有使用页框(物理内存)。只有当一个线程想要写入零页时,才会出现页面错误并且实际分配了页框(写入时复制)。
因此,如果一个线程不使用它的大部分堆栈,它应该消耗很少的内存。当然,在最坏的情况下,每个线程都可能消耗其所有堆栈,因此会消耗大量内存。
如果您有 CPU 密集型任务,那么您可能不想拥有比 CPU 内核更多的任务。否则,您将浪费时间在上下文切换(包括冷缓存)、TLB 未命中等后果上。
关于资源:有太多太多提及。
推荐阅读
- react-admin - React-admin:数据提供者中缺少标头对象
- spring-boot - 所有 bean 属性都分配为 null
- sql - 如何在 oracle 中使用 regexp_replace 在 oracle 中允许重音字符?
- excel - 有没有办法搜索和隐藏所有不包含输入给定单元格的值的列?
- c - 为什么我的结构指针忘记了字符串?
- python-3.x - 有没有办法在框架内的标签上绑定 MouseWheel 事件
- go - 无法在生产中将文件上传到谷歌云存储
- jquery - 多个请求发送到服务器后 500 (Internal Server Error)
- java - 有没有办法使用 Maven Failsafe 插件来分叉 Java VM。我正在将 Junit 与 Serenity Runner 一起使用
- c#-8.0 - 当 C#8 发布时,它将在哪些框架上运行?