Java HotSpot(TM) 64位服务器虚拟机警告

49

我有一台Tomcat作为我的Web服务器,它自动停机并显示以下错误 -

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f16a8405000, 12288, 0) failed; error='Cannot allocate memory' (errno=12)

我需要弄清楚到底发生了什么?这个警告是什么意思?


什么是操作系统?它是否有足够的资源(RAM)?在Linux上查看https://dev59.com/GInca4cB1Zd3GeqP5g-c。 - Jayan
Ubuntu 14.04操作系统,16 GB服务器 - Greesh Kumar
我在从apache中运行Java时遇到了一个问题(类似的错误)。可以参考此处所描述的修复方法:https://stackoverflow.com/a/52201705/284602。 - Andron
4个回答

56

Java运行时环境可用内存不足,无法继续运行。

本地内存分配(malloc)无法为保留内存分配xxxxx字节。

可能的原因:

  1. 系统物理内存或交换空间已满
  2. 在32位模式下,进程大小限制已达到上限

可能的解决方案:

  1. 减少系统上的内存负载
  2. 增加物理内存或交换空间
  3. 检查交换空间是否已满
  4. 在64位操作系统上使用64位Java
  5. 减少Java堆大小(-Xmx/-Xms)
  6. 减少Java线程数量
  7. 减小Java线程栈大小(-Xss)
  8. 使用-XX:ReservedCodeCacheSize设置更大的代码缓存

如果您使用的是Java 8或更高版本,请参见此问题:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize


15
这个答案是从JVM生成的日志文件中复制粘贴的建议。更诚实的做法应该是引用这个文件......但这样也能解决问题(我增加了虚拟机的物理内存)。谢谢! - Julien Kronegg
1
为什么应该使用-Xms/-Xmx来减少Java堆空间或/和使用-Xss来减少Java线程堆栈空间作为解决方案之一。我原本期望这些值中的一个(或两个)应该被增加而不是减少... - Steffen
4
减小最大堆空间可以帮助解决问题的原因在于,它限制了Java虚拟机请求超出操作系统可用内存的更多内存。引起错误的情况是JVM正在请求操作系统没有的内存(这意味着JVM仍然未达到其最大阈值)。 - gorjusborg
在过度提交设置方面可能也会出现问题,这可能会导致负载机对可用内存过度悲观,并拒绝分配您的请求。我遇到了这个问题,因为一个应用程序分叉自己,并且每个进程中都有相同的内存页面副本。即使它们是写时复制的,系统也只能考虑内存使用情况,就好像所有这些内存页面都是复制的一样。 - Juan
哈哈,我有32GB的内存,但对于Java(TM)运行时环境(TM)仍然不够。 - szx

12

Java无法分配足够的内存,即不是Java的堆限制造成的问题,而是操作系统没有更多内存可供Java使用。请检查机器是否没有耗尽内存。首先清理内存或增加内存,然后检查是否出现内存不足错误,然后增加堆大小:

-Xms128m 最小堆大小

-Xmx512m 最大堆大小

-XX:MaxPermSize 最大永久代大小


1
mastadminchat03@PRDMASTCHAT03:~$ free : 总共 = 14361104,已使用 = 6188292,可用 = 8172812,共享 = 428,缓存区 = 57396,已缓存 = 1233592。 - Greesh Kumar

2

Java运行环境的内存不足。

我遇到了与下面所示的相同问题。

OpenJDK 64位服务器VM警告:INFO:os::commit_memory(0x00000000f80f7000, 20729856, 0) failed; error='Cannot allocate memory' (errno=12)

我通过以下步骤解决了这个问题。

有一些进程占用了它们在/tmp上访问的文件。

使用lsof检查:

lsof | grep deleted

今日免费次数已满, 请开通会员/明日再来

-1
在命令行中输入以下代码:"docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 -e SONAR_WEB_JVM_OPTS="-Xms128m -Xmx512m" sonarqube"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接