5.1 新しいネイティブ スレッドを作成できない
Java アプリケーションは一般にマルチスレッドです。これは、Java で書かれたプログラムが (一見) 同時に複数のことを実行できることを意味します。たとえば、マシンにプロセッサが 1 つしかない場合でも、コンテンツをあるウィンドウから別のウィンドウにドラッグすると、複数のことを同時に行っているため、バックグラウンドで再生されている映画が停止することはありません。
スレッドについて考える 1 つの方法は、スレッドをタスクを送信できるワーカーとして考えることです。ワーカーが 1 人しかいない場合、そのワーカーは一度に 1 つのタスクしか実行できません。しかし、自由に使えるワーカーが 12 人いる場合、スレッドは次のことを行うことができます。すべてを同時に実行してください。 いくつかのリクエストがあります。
さて、現実世界の従業員と同じように、JVM のスレッドも、呼び出された作業を実行するためにある程度のスペースが必要です。スレッドの数がこのメモリ スペースの制限を超えると、次のような疑問が生じます。
このメッセージは、Java アプリケーションが実行できるスレッド数の上限に達したことjava.lang.OutOfMemoryError: Unable to create new native thread
を意味します。
5.2 理由
JVM が OS からの新しいスレッドに適用されている限り、それが発生する可能性がありますjava.lang.OutOfMemoryError: Unable to create new native thread
。基盤となる OS が新しいネイティブ スレッドを割り当てることができない限り、この OutOfMemoryError がスローされます。正確なネイティブ スレッド制限は、対応するプラットフォームに依存するため、次の例をjava.lang.OutOfMemoryError: Unable to create new native thread
実行してこの制限を見つけることをお勧めします。ただし、一般に、トリガーは次の段階を経ます。
- JVM で実行されているアプリケーションが新しい Java スレッドを要求します
- JVM ネイティブ コードは、新しいネイティブ スレッドを作成するために OS に渡されます。
- OS は新しいネイティブ スレッドを作成しようとし、このスレッドにメモリを割り当てる必要があります。
- 32 ビット Java プロセス サイズがメモリ アドレス領域を使い果たした (例: 2 ~ 4 GB のプロセス サイズ制限に達した) か、OS が仮想メモリを使い果たしたために、OS はネイティブ メモリ割り当てを拒否します。
java.lang.OutOfMemoryError: Unable to create new native thread
エラーがスローされます。
5.3 例
次の例では、ループ内で新しいスレッドを開始して作成します。このコードを実行すると、オペレーティング システムはすぐに制限に達し、メッセージが表示されますjava.lang.OutOfMemoryError: Unable to create new native thread
。
while (true) {
new Thread(new Runnable()) {
public void run() {
try {
Thread.sleep(10000000);
} catch (InterruptedException e) { }
}
}}.start();
}
正確なネイティブ スレッド制限はプラットフォームに依存しており、Windows、Linux、Mac OS X で次のようにテストされています。
- 64 ビット Mac OS X 10.9、Java 1.7.0_45 - 2031スレッドを作成すると JVM が停止します
- 64 ビット Ubuntu Linux、 Java 1.7.0_45 - 31893スレッド
を作成した後に JVM が停止する - 64 ビット Windows 7、Java 1.7.0_45 - この OS は別のスレッド モデルを使用しているため、このプラットフォームではエラーがスローされないようです。250,000 の場合、スワップ領域が 10 GB を使用しているにもかかわらず、プロセスはまだ生きており、アプリケーションは非常に深刻なパフォーマンスの問題に直面しています。
java.lang.OutOfMemoryError: Unable to create new native thread
したがって、少しのテスト時間を導入する前に、いつテストが開始されるかを確認するために、コンピューターの制限を必ず理解してください。
5.4 解決策
場合によっては、OS レベルで制限を増やすことでこの問題を回避できますUnable to create new native thread
。たとえば、JVM がユーザー空間で生成できるものを制限している場合はmax user processes
、この制限を確認して増やしてみてください。
[root@dev ~]# ulimit -a
core file size (blocks, -c) 0
--- cut for brevity ---
max user processes (-u) 1800
多くの場合、ネイティブ マシンがスレッド制限に達したため、OutOfMemoryError がスローされます。これはプログラミング エラーを示している可能性があります。アプリケーションが何千ものスレッドを生成する場合、何か問題が発生している可能性が高くなります。恩恵を受けることができるアプリケーションはそれほど多くありません。非常に多くのスレッド (スレッドが多すぎます)。
この問題を解決する 1 つの方法は、スレッド ダンプを取得してシナリオを理解することです。これには数日かかる場合があります。現時点では、私に連絡するのが最善の方法です (@ ̄ー ̄@)。