java线程在CPU周期和内存方面的大致“成本”是多少?
在java中使用线程的大致“成本”是多少?是否有经验值/经验值规则,创建一个线程需要多少内存?是否有一个粗略的估计,多少CPU周期的成本,以创建一个线程
上下文:在Web应用程序的servlet中,我希望将内容创建并行化,因为部分内容是基于文件、基于数据库以及基于Web服务的。但这意味着对于每个“http请求线程”(我的serlvet容器),我将有两到四个额外的线程。注意,我将在Java6中使用ExecutorService
当我在web服务器上使用数百到数千个Java线程时,我应该期待什么
# 1 楼答案
在准备一篇关于纤维的杂志文章(又名ProjectLowe)的过程中,我运行了一些简单的测试(Windows10、JDKLowes15.b3):
我的Windows桌面(i7-8700K)需要大约400000毫秒来创建所有10000个线程,另外需要200毫秒来运行计数器
令人惊讶的是,我无法确认每个线程512k的内存消耗(根据其他一些来源,是1Mb)。Windows内存监视器显示所有10000个线程的额外内存消耗仅为500Mb(每个线程50k)
Project Loom光纤分别在30毫秒和50毫秒内运行测试,并且没有显示可测量的内存消耗
# 2 楼答案
每个线程都有自己的堆栈,因此会立即影响内存。对于Java6512K,默认的线程堆栈大小是IIRC(不同的JVM/版本可能会有不同的默认值)。此数字可使用
-Xss
选项进行调整。因此,使用数百个线程将对VM消耗的内存产生影响(很可能在任何CPU影响之前,除非这些线程正在运行)我见过客户机遇到与线程/内存相关的问题,因为这不是一个明显的联系。创建100000个线程(使用执行器/池等)很简单,内存问题似乎不会立即归因于此
如果您正在为许多客户机提供服务,那么您可能想看看JavaNIOAPI,特别是multiplexing,它允许异步网络编程。这将允许您仅使用一个线程处理多个客户机,从而减少对大量线程的需求
# 3 楼答案
这取决于:它取决于操作系统、Java版本和CPU。解决这个问题的唯一方法是尝试一下并测量结果
由于您将使用
ExecutorService
,因此控制线程数将非常简单。不要使用太少,否则请求会堆积起来。如果使用的线程太多,那么在Java线程用完之前,文件系统和DB就会出现性能问题