问题描述
昨天在一个业务中看到这样类似的问题,业务的大概情况是建立一个地铁站模型,模型大概的情况是这个样子的:
这个建模的逻辑不算是很复杂,就不展示了。但是在后期运行的时候出现了问题,问题是这个样子的:
OpenJDK 64-Bit Server VM warning: #
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 2055208960 bytes for Failed to commit area from 0x00000006ce000000 to 0x0000000748800000 of length 2055208960.
INFO: os::commit_memory(0x00000006ce000000, 2055208960, 0) failed; error='页面文件太小,无法完成操作。' (DOS error/errno=1455)
# An error report file with more information is saved as:
# C:\Users\xxx\Desktop\Model\hs_err_pid35552.log
问题出现原因
这个报错信息说明因为内存不足,JRE无法继续运行。这里涉及到java的一种文件映射机制
具体来说,JRE正在尝试使用mmap(一种将文件或设备映射到内存的机制)将一块长度为2055208960字节的内存映射到地址空间中,但是映射失败了。
报错信息还提供了一个错误报告文件,可以查看更多详细信息。根据报错信息,可能的原因是操作系统中的页面文件大小(请注意:这里的页面指的是操作系统的页面)不足以满足JRE的内存要求,因此无法将内存映射到地址空间中。通常我们可以通过增加可用内存或者调整页面大小,或者也可以上更大的RAM,或者更改操作系统的虚拟内存设置来增加页面文件的大小(但是代价很大)。
另外,我拿到这个模型的时候,首先注意到比例尺,这个比例尺相对来讲设计的比较小,而且在这位同学有提及,在修改完比例尺完之后。
解决方案
1)增加系统内存:如上所述,可以通过添加更多的RAM或虚拟内存来增加系统内存。
2)调整JVM堆大小:可以尝试通过调整任意逻辑仿真模型的JVM堆大小来解决该问题。可以通过修改任意逻辑仿真模型配置文件中的任意逻辑仿真模型JVM参数来调整JVM堆大小。例如,可以通过增加JVM参数"-Xmx"值来增加任意逻辑仿真模型的JVM堆大小,例如,"-Xmx2048m"表示将JVM堆大小设置为2048 MB。
3)优化您的模型:可以尝试优化任意逻辑仿真模型以减少其内存占用量。例如,可以尝试减少模型中的对象数量、减少对象属性数量、减少仿真时间段等。
4)检查其他程序:可以检查其他程序是否在占用系统内存。可以尝试关闭不需要的程序,以释放更多的系统内存。
5)尝试使用更高配置的计算机:如果你的任意逻辑仿真模型需要大量内存和CPU资源才能运行,则可以尝试在更高配置的计算机上运行它。
最后另外说一句:以前我们这边有做个profile工作,profile工作的目的就是用于JVM调优,所以如果需要优化模型的话,建议尝试一下,不过如果只是上述情况的话,也可以仔细的看一下log报错文件。