我有一台运行Solaris 10的服务器。它报告70 + GiB免费RAM。 我试图在64位模式下使用Java 1.7.0_80启动Tomcat 7.0.68。
服务器声称它不能分配RAM的717 MiB。 每次尝试时都会得到一个hs_err_pidxxx.log文件。 这表明了这一点:
# There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 717225984 bytes for committing reserved memory. # Possible reasons: # The system is out of physical RAM or swap space
不,有70个GiB可用,它正在尝试分配700个MiB。
# In 32 bit mode, the process size limit was hit
我们处于64位模式。
# Possible solutions: # Reduce memory load on the system
这台机器上除了操作系统外没有别的东西。
# Increase physical memory or swap space
我们已经有两个数量级以上的需要。
# Check if swap backing store is full
没有。
# Use 64 bit Java on a 64 bit OS
完成。
# Decrease Java heap size (-Xmx/-Xms)
如果我可以的话。
# Decrease number of Java threads
这是怎么做的?
# Decrease Java thread stack sizes (-Xss)
build议值? 这是默认的,但我不知道是什么来调整它。
# Set larger code cache with -XX:ReservedCodeCacheSize=
再次,我们默认。
$ swap -s total: 48607296k bytes allocated + 18201336k reserved = 66808632k used, 311770552k available
免费的RAM只是意味着没有任何东西存储在其中。 这并不意味着你可以使用它。 由于其他应用程序已经预留了内存,因此报告的RAM完全可以不被新的JVM使用。 在任何情况下,JVM就像大多数应用程序不要求RAM而是虚拟内存。 这很可能是您的系统正在遭受的问题,缺乏虚拟内存。
您将通过该命令了解您的虚拟内存使用情况:
swap -s
对虚拟内存不足的简单回答是简单地增加(或创build)用于存储器保留的交换区域以具有后备存储区域。
编辑:有了你张贴的额外信息,你的应用程序不能分配更多的虚拟内存的原因是因为你正在一个非全局的区域内运行内存上限。 非全局区域是容器,即它们都共享相同的内核。 但是,他们的资源使用可以被限制,以防止一个区域打扰其他区域。
在停止使用虚拟内存的其他进程之外,即使以root用户身份也无法从此区域执行任何操作。 您需要请全球区域pipe理员为您的区域授予更多虚拟内存 ,在您的情况下为zone.max-swap设置。