线程在 CPU 周期和内存中的粗略“成本”是多少?

2022-09-04 20:46:16

在java中使用线程的粗略“成本”是多少?是否有任何经验法则/经验值,创建一个线程需要多少内存?是否有粗略的估计创建线程需要多少个 CPU 周期?

上下文:在Web应用程序的servlet中,我想并行化内容创建,因为内容的一部分是基于文件的,基于数据库的以及基于Web服务的。但这意味着对于每个“http-request-thread”(我的serlvet容器),我将有两到四个额外的线程。请注意,我将在 Java 6 中使用 。ExecutorService

当我在Web服务器上使用数百到数千个Java线程时,我应该期待什么?


答案 1

每个线程都有自己的堆栈,因此会立即影响内存。对于 Java 6,默认线程堆栈大小为 IIRC,512k(不同的 JVM/版本可能具有不同的默认值)。此数字可使用该选项进行调整。因此,使用数百个线程将对 VM 消耗的内存产生影响(很可能在任何 CPU 影响之前,除非这些线程正在运行)。-Xss

我见过客户端遇到与线程/内存相关的问题,因为它不是一个明显的链接。创建100,000个线程(使用执行器/池等)是微不足道的,并且内存问题似乎不能立即归因于此。

如果您正在为许多客户端提供服务,则可能需要查看Java NIO API,特别是多路复用,它允许异步网络编程。这将允许您仅使用一个线程处理许多客户端,从而减少对大量线程的需求。


答案 2

这取决于:这取决于操作系统,Java版本和CPU。弄清楚这一点的唯一方法是尝试并测量结果。

由于您将使用 ,因此控制线程数将非常简单。不要使用太少,否则请求会堆积起来。如果使用太多,则在 Java 线程用完之前很久,您的文件系统和数据库就会遇到性能问题。ExecutorService