Java虚拟机可以支持多少线程?

22 浏览
0 Comments

Java虚拟机可以支持多少线程?

Java虚拟机可以支持多少线程? 这是否根据供应商,操作系统或其他因素而异?

admin 更改状态以发布 2023年5月21日
0
0 Comments

嗯,有很多。

这里有几个参数。具体的虚拟机,然后通常在虚拟机上还有一些运行时参数。这在某种程度上由操作系统驱动:底层操作系统对线程的支持是什么,它对它们施加了什么限制?如果虚拟机确实使用了底层操作系统线程,那么就是老式的红线程/绿线程的问题。

“支持”的含义是另一个问题。如果你编写了一个像这样的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();
        }
    }
}

在Intel的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)
0
0 Comments

这取决于您使用的CPU,操作系统,其他进程的运行情况,您使用的Java版本以及其他因素。我曾经看到一个Windows服务器在崩溃之前有超过6500个线程。当然,大多数线程实际上并没有做任何事情。一旦机器达到了约6500个线程(在Java中),整个机器就开始出现问题并变得不稳定。

根据我的经验,Java(最新版本)可以愉快地消耗计算机可以支持的任意数量的线程而不会出现问题。

当然,您必须有足够的RAM,并且必须使用足够的内存启动Java,以执行线程执行的所有操作并为每个线程提供堆栈。任何具有现代CPU(最近几代的AMD或Intel)和1-2Gig内存(取决于操作系统)的计算机都可以轻松支持具有数千个线程的JVM。

如果您需要比这更具体的答案,则最好使用分析工具。

0