Q:
1) マルチスレッド アプリケーションでは、アプリケーションが生成できるスレッドの数に制限があります。
2) そのような制限が存在する場合、JVM はアプリケーションを終了し、どのエラー コードで終了しますか。
編集
3) アプリケーションが非常に連続して生成された場合、JVM はそれを「ラフな」アプリケーションとして検出しますか?
前もって感謝します
Q:
1) マルチスレッド アプリケーションでは、アプリケーションが生成できるスレッドの数に制限があります。
2) そのような制限が存在する場合、JVM はアプリケーションを終了し、どのエラー コードで終了しますか。
編集
3) アプリケーションが非常に連続して生成された場合、JVM はそれを「ラフな」アプリケーションとして検出しますか?
前もって感謝します
セットアップ用にテストする必要があります。私は自分のためにしました:
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)
JVM 仕様で指定された制限はありません。ただし、OSは(おそらく)通常どおりプロセスごとに制限する場合があります。各スレッドはスタックなども割り当てるため、大量のメモリが必要になる可能性があるため、コンピューターによっては、最初にどの制限に達するか..
注意: ただし、スレッドが多すぎると通常は非効率的です。あなたのプログラムは、おそらく別の方法でより適切にスケーリングできる/すべきです。必要に応じて、スレッド プール (エグゼキュータ サービス)、非同期 I/O、フォーク/ジョインなどを使用します。
以下も参照してください。
JVM によって終了される前にアプリケーションが生成できるスレッドの数
質問は誤った前提に基づいています。JVM が新しいスレッドを作成する能力を使い果たすと、余分なスレッドを作成しようとしたコードに例外がスローされます。アプリケーションは「JVM によって終了」されません。
私が感じる個々のスレッドであなたがどれだけやっているかにかかっています. 環境変数でJVMにリソースを与えることができるので、かなりの量があると思います。また、エラー コードは、OutOfMemoryException、ヒープ スペースの問題である可能性が最も高くなります。
また、手動スレッドを作成しているか、スレッド プールを使用しているかによっても異なります。手動スレッドを作成するたびに、コアがかかります。スレッドプールにはありません。