奇妙な問題にぶつかりました。
私は32GBのRAMを搭載したマシンを持っています。スケール テストの目的で、あるアプリケーションの複数のインスタンスを別のクラス ローダーで生成するプログラムを作成しました。私の目標は、1 つのプロセスで同じアプリケーションで 1000 個のインスタンスをホストすることです。私はこの仕事に徐々に取り組みました。最大 800 のインスタンスを問題なくホストできました。
インスタンスを 1000 に増やすと、メモリ不足エラーが発生します。完全なログhs_err.logについては、次のファイルを参照してください。
ご覧のとおり、私のプログラムはメタスペースからの割り当てに失敗しています。これは、メタスペースが約 1 GB のメモリに達すると一貫して発生します。Java のドキュメントによると、メタスペース領域は制限されておらず、私のマシンには 1 GB を超えるメタスペースに対応する十分なメモリがあります。
プロセスがクラッシュすると、次のメッセージが表示されます。
mmap failed for CEN and END part of zip file
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f5056e7c000, 12288, 0) failed; error='Cannot allocate memory' (errno=12)
There is insufficient memory for the Java Runtime Environment to continue.
Native memory allocation (mmap) failed to map 12288 bytes for committing reserved memory.
An error report file with more information is saved as:
/opt/itzik/multirunner-1.0.0/hs_err_pid8568.log
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f50570c6000, 262144, 0) failed; error='Cannot allocate memory' (errno=12)
[thread 139989735913216 also had an error]
mmap failed for CEN and END part of zip file
mmap failed for CEN and END part of zip file
[thread 139984035763968 also had an error][thread 139985862088448 also had an error]
[thread 139983882610432 also had an error]
私の質問は次のとおりです。
- メタスペースのサイズに文書化されていない制限はありますか (たまたま 1 GB です)?
- プログラムで使用できるクラスローダーの数に制限はありますか?
- 私のプログラムが添付ファイルからクラッシュする理由を説明する他の手がかりはありますか?
ありがとう