Java “什么是粗糙的”;“成本”;一个线程在CPU周期和内存中所占的比例?

Java “什么是粗糙的”;“成本”;一个线程在CPU周期和内存中所占的比例?,java,multithreading,Java,Multithreading,在java中使用线程的大致“成本”是多少?是否有经验值/经验值规则,创建一个线程需要多少内存?是否有一个粗略的估计,多少CPU周期的成本,以创建一个线程 上下文:在Web应用程序的servlet中,我希望将内容创建并行化,因为部分内容是基于文件、基于数据库以及基于Web服务的。但这意味着对于每个“http请求线程”(我的serlvet容器),我将有两到四个额外的线程。注意,我将在Java6中使用ExecutorService 当我在web服务器上使用数百到数千个Java线程时,我应该期待什么呢?

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

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


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

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

我见过客户机遇到与线程/内存相关的问题,因为这不是一个明显的联系。创建100000个线程(使用执行器/池等)很简单,内存问题似乎不会立即归因于此


如果您正在为许多客户机提供服务,您可能需要了解JavaNIOAPI,尤其是它允许异步网络编程。这将允许您只使用一个线程处理多个客户端,从而减少对大量线程的需求。

这取决于:它取决于操作系统、Java版本和CPU。解决这个问题的唯一方法是尝试一下并测量结果


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

在准备一篇关于光纤的杂志文章(又名project Lowe)时,我运行了一些简单的测试(Windows 10、JDK Lowe 15.b3):

AtomicInteger计数器=新的AtomicInteger(T);
AtomicBoolean go=新的AtomicBoolean(false);
对于(int i=0;i<10000;i++){
newThread(Thread.VIRTUAL,()->{//
AtomicInteger counter = new AtomicInteger(T);
AtomicBoolean go = new AtomicBoolean(false);
for (int i = 0; i < 10000; i++) {
  Thread.newThread(Thread.VIRTUAL, () -> { // <-- remove Thread.VIRTUAL for plain Threads
    while (!go.get()) Thread.sleep(1);
    counter.decrementAndGet();
  }).start();
}