java - 线程在 CPU 周期和内存中的粗略 "Cost"是多少?

标签 java multithreading

在 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/

相关文章:

c++ - 如何等待 Glib::Dispatcher 的连接函数完成?

Android MediaPlayer 使用大量资源

c++ - 在线程池中组织任务

java - Java 中的指数(足够简单)

java - 用空值填充文本框

java - 注入(inject)组件到已部署的 Tomcat 服务器 [Spring Boot] 失败

c++ - 为什么我要使用共享内存和单独的进程而不是 std::thread ?

java - frame.setResizable(false) 不起作用!它改变窗口大小而不是保持尺寸

java - 删除彼此相邻的重复项

c# - 僵局澄清?