当前位置: 首页 > news >正文

杂记-1

threadpool 中什么场景会使用同步阻塞队列 (SynchronousQueue)

使用同步队列意味着 queue 的 size 为 0 , 进来的请求(maxsize thread 满负荷运行时)全部都得在外面等着 , 都是阻塞的; 其中一个场景就是 cache 模式 .
那么 cache 模式要选用同步 queue 呢 ? 因为它的 max size 为最大呀 . 根本不会让它们到 queue 这个地步 .

ExecutorService pool = new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>()  // 同步阻塞队列
);

假如我的电脑cpu 是 AMD R5 3600 6 个核心数 , 单单从核心数这个角度 ,运行在我这台机器的application 最大的线程池可以开多大 ? 理由是什么 ?

这是一个很经典的问题,但答案可能和直觉相反:从 CPU 核心数这个单一角度,理论上线程池大小可以开到非常大(几千甚至上万),不会因为“核心数只有 6 个”而直接限制。

但需要严格区分“最大可创建”与“最佳性能”。

1. 纯理论极限(操作系统层面)

仅从 Java 线程映射到操作系统原生线程 来看:

  • 每个线程需要分配线程栈内存(默认 Linux 上约 1MB,可通过 -Xss 调整)
  • 理论上限受限于 进程可用内存 / 线程栈大小
  • 例如:应用分配 4GB 堆内存 + 2GB 其他内存,栈 1MB → 最多约 2000 个线程

结论:你的 6 核 CPU 本身不会限制线程总数,内存才是第一个硬上限。

2. 为什么 CPU 核心数不是上限?

因为线程不只是用来做 CPU 计算:

  • I/O 密集型任务(网络调用、数据库查询、文件读写):线程大部分时间在阻塞等待,不占用 CPU。此时可以开远多于 6 个线程,比如 200 个,让 CPU 在等待间隙切换处理其他任务。
  • 只有纯 CPU 密集型(如死循环计算)时,超过 6 个活跃线程才会导致频繁上下文切换,反而降低性能。

3. “最大” vs “合理” 线程数

任务类型 推荐公式(核心数角度) 举例(6 核)
纯 CPU 计算 N_cpu + 1 7 左右
I/O 密集型 N_cpu * (1 + 阻塞时间/计算时间) 若阻塞占比 90%,可到 60+
可容忍大量线程 受内存限制 几百到上千

4. 你的 R5 3600(6 核 12 线程)

注意:R5 3600 有 6 个物理核心 + SMT(超线程),操作系统看到的是 12 个逻辑核心

  • 纯计算场景:建议线程池大小 ≈ 12~24(考虑超线程)
  • I/O 密集:轻松 100~300,甚至更高

5. 真正会阻止你“开太大”的因素(按常见顺序)

  1. 内存耗尽(每个线程占用栈内存)
  2. 上下文切换开销(线程数远大于逻辑核心数时,调度开销非线性增长)
  3. 操作系统限制ulimit -u 用户最大进程/线程数)
  4. 应用自身设计(锁竞争、共享资源瓶颈)

总结

  1. 影响最大线程数的因素不仅是CPU 核心数 , 还有内存 ,在内存充足的情况下,你可以创建上千个线程。
  2. 合理大小取决于任务是 CPU 密集还是 I/O 密集 —— 对纯计算任务,超过 12~24 个活跃线程反而会变慢。

应用分配 4GB 堆内存 + 2GB 其他内存,栈 1MB → 最多约 2000 个线程 , 如何得出是 2000 个的呢 , 是因为 2GB 吗

因为线程栈不在堆里分配。线程栈是 JVM 启动时通过 mmap 在进程的虚拟地址空间中分配的内存区域,独立于 Java 堆。

  • 堆内存(-Xmx)是专门给 Java 对象用的
  • 每个线程的栈(-Xss)是从进程剩余的虚拟地址空间中分配的

堆内存:4 GB(-Xmx4g) , 这个参数是不是表示 java 这个进程启动的时候就会向 操作系统申请 4GB 的大小 , 还是说用一点申请一点 , 达到 4GB jvm 就会报错

-Xmx4g 不是启动时申请 4GB 物理内存,而是预留 4GB 虚拟地址空间。物理内存按需分配,最多到 4GB。达到上限时 JVM 抛出 OutOfMemoryError。

http://www.jsqmd.com/news/641892/

相关文章:

  • 自动注册ocx
  • Rust 所有权模型在并发编程中的体现
  • 避坑指南:为什么你下载的GitHub项目zip包总是缺少子模块?(以CoolProp为例)
  • AI短剧革命!AniShort重新定义团队协作新范式
  • MoveIt中通过代码动态加载自定义模型到RVIZ的实践指南
  • 2026年高性价比GEO优化,源头厂家权威排行揭晓
  • RN中如何处理推送通知(本地推送、远程推送),点击推送跳转指定页面?
  • GitHub汉化插件终极指南:3分钟实现GitHub中文界面的完整教程
  • Windows11word文件不显示图标解决办法
  • Xilinx Series 7 PCIe XDMA实战:从工程构建到上位机调试全链路解析
  • 2026年4月14日成都市场盛世钢联工角槽钢价格行情 - 四川盛世钢联营销中心
  • 手把手教你用Pollyoyo实现高级图表绘制(含PlantUML和Mermaid教程)
  • 别再手动建模了!用SolidWorks+Simscape Multibody Link,5分钟搞定机械臂动力学仿真
  • Rust 内存管理与所有权模型
  • 域---DC02 故障后重新搭建额外域控制器的完整指南
  • windows自带ftp服务搭建及防火墙设置
  • 抖音批量下载终极指南:5分钟掌握无水印视频采集
  • 高端局!追觅电视多项首创技术斩获10+国际国内大奖,实力封神
  • 手把手教学:用THE LEATHER ARCHIVE快速生成高级感皮革时尚图片
  • 基于 Patroni + etcd + HAProxy 的 PostgreSQL 高可用集群实战指南
  • ETTh1_base
  • 别再只盯着分类了!YOLOv9里的DFL Loss,原来是这样搞定边界框回归的
  • 5分钟掌握SketchUp STL插件:3D打印模型转换完整指南
  • AI PM | 我做了一个会自己进化的网站
  • 宝塔面板如何查看系统CPU占用趋势_监控面板自带性能报表
  • 运维视角复盘:一个‘顺心借’金融App的后台服务器架构与安全配置踩坑记录
  • 千分尺 | 操作规范及实操读数
  • 如何无线地将照片从 iPhone 传输到 PC?
  • STM32与AHT20温湿度传感器:基于状态机的中断驱动开发实践
  • 告别填表焦虑!盘点 2026 年最能提升转化率的 10 款表单构建工具