在 Java 中使用线程的粗略“成本”是多少?是否有任何经验法则/经验值,创建一个线程需要多少内存?是否粗略估计创建一个线程需要多少个 CPU 周期?
上下文:在 web 应用程序的 servlet 中,我想并行化内容创建,因为内容的一部分是基于文件、基于数据库以及基于 web 服务的。但这意味着对于每个“http-request-thread”(我的 serlvet 容器),我将有两到四个额外的线程。请注意,我将在 Java 6 中使用 ExecutorService
。
当我在 Web 服务器上使用成百上千个 Java 线程时,我应该期待什么?
最佳答案
每个线程都有自己的堆栈,因此会立即影响内存。对于 Java 6,默认线程堆栈大小为 ,IIRC,512k(不同的 JVM/版本可能有不同的默认值)。这个数字可以使用 -Xss
选项进行调整。因此,使用数百个线程将对 VM 消耗的内存产生影响(很可能在任何 CPU 影响之前,除非这些线程正在运行)。
我见过客户遇到与线程/内存相关的问题,因为这不是一个明显的联系。创建 100,000 个线程(使用执行程序/池等)是微不足道的,内存问题似乎不会立即归因于此。
如果您要为许多客户提供服务,您可能需要查看 Java NIO API,尤其是 multiplexing ,它允许异步网络编程。这将允许您仅用一个线程处理许多客户端,从而减少对大量线程的需求。
关于java - 线程在 CPU 周期和内存中的粗略 "Cost"是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1492711/