有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java线程在CPU周期和内存方面的大致“成本”是多少?

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

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

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


共 (3) 个答案

  1. # 1 楼答案

    在准备一篇关于纤维的杂志文章(又名ProjectLowe)的过程中,我运行了一些简单的测试(Windows10、JDKLowes15.b3):

    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();
    }
    

    我的Windows桌面(i7-8700K)需要大约400000毫秒来创建所有10000个线程,另外需要200毫秒来运行计数器

    令人惊讶的是,我无法确认每个线程512k的内存消耗(根据其他一些来源,是1Mb)。Windows内存监视器显示所有10000个线程的额外内存消耗仅为500Mb(每个线程50k)


    Project Loom光纤分别在30毫秒和50毫秒内运行测试,并且没有显示可测量的内存消耗

  2. # 2 楼答案

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

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

    如果您正在为许多客户机提供服务,那么您可能想看看JavaNIOAPI,特别是multiplexing,它允许异步网络编程。这将允许您仅使用一个线程处理多个客户机,从而减少对大量线程的需求

  3. # 3 楼答案

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

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