【问题标题】:How many threads may an application generate before beeing terminated by the JVM一个应用程序在被 JVM 终止之前可以生成多少个线程
【发布时间】:2012-05-20 16:24:06
【问题描述】:

问:

1) 在多线程应用程序中,应用程序可以产生多少线程。

2)如果存在这样的限制,JVM会终止应用程序吗?错误代码是什么。

编辑

3)如果一个应用程序以非常快的速度生成,JVM 是否会将其检测为“粗糙”应用程序

提前致谢

【问题讨论】:

标签: java multithreading


【解决方案1】:

您应该针对您的设置对其进行测试。我为我做的:

import static java.lang.Thread.currentThread;
import java.util.concurrent.CountDownLatch;

public class Test {
  static final Thread t = currentThread();
  public static void main(String[] args) throws Exception {
    int i = 0;
    try {
      while (true) {
        final CountDownLatch l = new CountDownLatch(1);
        new Thread() { public void run() { l.countDown(); park(); }}.start();
        l.await();
        i++;
      }
    } finally { System.out.println("Started " + i + " threads."); }
  }
  private static void park() {
    try { t.join(); } catch (InterruptedException e) {
      System.out.println("Unparked");
    }
  }
}

输出:

Started 2030 threads.
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:658)
    at test.Test.main(Test.java:10)

【讨论】:

【解决方案2】:

JVM 规范没有指定限制。操作系统可能(可能)像往常一样限制每个进程等。 每个线程还将分配一个堆栈等,因此可能需要大量内存,因此取决于计算机首先达到的限制..

请注意:过多的线程通常是低效的。您的程序可以/应该以另一种方式更好地扩展。根据您的需要使用线程池(执行器服务)、异步 I/O、fork/join 等。

另见:

Is there any hard limit to a number of threads in Java?

How many threads can a Java VM support?

【讨论】:

    【解决方案3】:

    1)。不,没有限制。至少不是那样。当然你会耗尽内存。

    2)。 OutOfMemoryException。

    3)。你的意思是像Fork bomb?没有。

    【讨论】:

      【解决方案4】:

      应用程序在被终止之前可以生成多少个线程 通过JVM

      这个问题是基于一个错误的前提。当 JVM 无法创建新线程时,它只会向试图创建额外线程的代码抛出异常。应用程序没有“被 JVM 终止”。

      【讨论】:

        【解决方案5】:

        归结为你对我感觉的每个单独线程做了多少。您可以使用环境变量为 JVM 提供资源,所以我想有很多。而且错误码很可能是OutOfMemoryException, Heap Space questions。

        这也归结为,您是制作手动线程还是使用线程池。每次制作手动线程时,都需要一个核心。线程池没有。

        【讨论】:

        • 线程不占用核心。任何线程实际上每次重新启动时都可以在任何核心上运行。您所说的意味着您不能启动超过 2-4 个线程。当void main 中的第一行代码运行时,JVM 中已经有十几个线程了。
        • 我的意思是,如果你自己启动一个线程而不使用线程池,你会占用更多的 CPU。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多