我遇到了一个奇怪的问题。
我有一台 32GB 内存的机器。出于规模测试的目的,我编写了一个程序,该程序在不同的类加载器中生成某个应用程序的多个实例。我的目标是在 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)?
- 我的程序可以使用的类加载器的数量是否有限制?
- 您是否看到其他一些线索来解释为什么我的程序从附件中崩溃?
谢谢