一个 Java VM 可以支持多少个线程?

2022-08-31 05:37:32

一个 Java VM 可以支持多少个线程?这是否因供应商而异?按操作系统?其他因素?


答案 1

这取决于你使用的CPU,操作系统,其他进程正在做什么,你正在使用的Java版本以及其他因素。我见过Windows服务器在关闭机器之前>6500个线程。当然,大多数线程都没有做任何事情。一旦机器达到大约6500个线程(在Java中),整个机器就开始出现问题并变得不稳定。

我的经验表明,Java(最新版本)可以愉快地使用与计算机本身可以托管的线程一样多的线程, 而不会出现问题。

当然,你必须有足够的RAM,你必须启动具有足够内存的Java来完成线程正在做的所有事情,并为每个线程都有一个堆栈。任何具有现代CPU(最近几代AMD或Intel)和1-2 Gig内存(取决于操作系统)的机器都可以轻松支持具有数千个线程的JVM。

如果您需要比这更具体的答案,最好的选择是分析。


答案 2

嗯,很多。

这里有几个参数。特定的 VM,以及 VM 上通常还有运行时参数。这在某种程度上是由操作系统驱动的:底层操作系统对线程有什么支持,它给它们带来了什么限制?如果 VM 实际上使用 OS 级线程,那么旧的红色线程/绿色线程就是一件好事。

“支持”是什么意思是另一个问题。如果你写了一个Java程序,它只是像

   class DieLikeADog {
         public static void main(String[] argv){
             for(;;){
                new Thread(new SomeRunaable).start();
             }
         }
    }

(不要抱怨小的语法细节,我正在喝第一杯咖啡),那么你当然应该期望有成百上千个线程运行。但是创建线程相对昂贵,调度程序开销可能会变得很严重。目前还不清楚您是否可以让这些线程做任何有用的事情。

更新

好吧,无法抗拒。这是我的小测试程序,有几个点缀:

public class DieLikeADog {
    private static Object s = new Object();
    private static int count = 0;
    public static void main(String[] argv){
        for(;;){
            new Thread(new Runnable(){
                    public void run(){
                        synchronized(s){
                            count += 1;
                            System.err.println("New thread #"+count);
                        }
                        for(;;){
                            try {
                                Thread.sleep(1000);
                            } catch (Exception e){
                                System.err.println(e);
                            }
                        }
                    }
                }).start();
        }
    }
}

在英特尔的OS / X 10.5.6和Java 6 5(请参阅评论)上,这是我得到的

New thread #2547
New thread #2548
New thread #2549
Can't create thread: 5
New thread #2550
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
        at java.lang.Thread.start0(Native Method)
        at java.lang.Thread.start(Thread.java:592)
        at DieLikeADog.main(DieLikeADog.java:6)