java可以创建多少个线程

记得以前在jvm的群里讨论过,与系统环境设置有关,我在mac os上试验的。

% sysctl kern.num_taskthreads  
kern.num_taskthreads: 2048

用repl来模拟一下,在启动repl后线程大概有20个左右,现在看看还可以启动多少个线程:

scala> import java.util.concurrent.atomic.AtomicInteger

scala> val n = new AtomicInteger(0)

scala> val run = new Runnable(){
        override def run() { n.incrementAndGet ;Thread.sleep(1000000) }}

scala> try{ while(true){ val t = new Thread(run); t.start } } catch{
            case e:Throwable => println("count: " + n.get) 
        }
count: 2025

运行过程中jvm可能还有其他线程也会启动,总的线程数加起来正好2048(或者接近).

如果系统参数设置一个很大的值,那java可创建的线程数就只与内存相关了。

如果指定的-Xss越大,java进程在non-heap区域为每个线程分配的初始也越大。栈空间分配的初始值通常比Xss设定的要小,VM并不会一上来就分配与之对等的内存。

另外一点有趣的是,如果你分配给jvm的堆空间(heap size)太大,系统中如果没有足够多的剩余空间的话,non-heap可分配的就越小,可创建的线程数也反而少了。也就是说heap与non-heap是竞争关系。参考这里

java可以创建多少个线程》上有2条评论

  1. hongjiang 文章作者

    For a 32-bit JVM, the Java heap space is in a race with the native heap, including the thread capacity

    For a 64-bit JVM, the thread capacity will mainly depend of your OS physical & virtual memory availability along with your current OS process related tuning parameters

    回复
  2. fair_jm

    64bit win7 这段代码跑了6分钟 内存一点点到4G CPU也满了…但还是没爆异常..然后看到内存有回落再上升 回落再上升…. 手工结束了进程…

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注