当前位置: 首页 > 知识库问答 >
问题:

JVM崩溃时错误='无法分配内存'(Errno=12),即使内存可用

柯正谊
2023-03-14

我在Java中遇到JVM无法分配内存的问题

OpenJDK 64位服务器VM警告:info:OS::Commit_Memory(0x0000000734880000,880279552,0)失败;error=“无法分配内存”(errno=12)

内存不足,Java运行时环境无法继续。本机内存分配(mmap)无法映射880279552字节以提交保留内存。包含更多信息的错误报告文件保存为:/home/ec2-user/tools/apache/apache-tomcat-9.0.6/bin/hs_err_pid23366.log java.lang.NullPointerException

这是我的记忆统计数据

MemTotal:        8166744 kB
MemFree:         3788780 kB
MemAvailable:    3861816 kB
Buffers:               0 kB
Cached:           286536 kB
SwapCached:            0 kB
Active:          4030520 kB
Inactive:         182596 kB
Active(anon):    3926808 kB
Inactive(anon):    24892 kB
Active(file):     103712 kB
Inactive(file):   157704 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               192 kB
Writeback:             0 kB
AnonPages:       3926652 kB
Mapped:            72652 kB
Shmem:             25120 kB
Slab:             100300 kB
SReclaimable:      60032 kB
SUnreclaim:        40268 kB
KernelStack:        5616 kB
PageTables:        21632 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     4083372 kB
Committed_AS:    5723980 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      286720 kB
DirectMap2M:     8101888 kB

这看起来像是一个重复的JVM堆内存不足的问题。最接近这个问题的是this thread

然而,不同的是,在链接线程中,用户的可用空间更少,而JVM试图分配更高的内存(打开和关闭情况)。

export CATALINA_HOME="/home/ec2-user/tools/apache/apache-tomcat-9.0.6/"
export JAVA_OPTS="-Xms2048m -Xmx4096m -DJDBC_CONNECTION_STRING=jdbc:mysql://localhost:3306/databasename?autoReconnect=true -DJDBC_DATABASER=dbname-DJDBC_USER=username-DJDBC_PASSWORD=password-DAPPLICATION_PRO$
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-0.amzn2.x86_64"
  PID  PPID CMD                         %MEM %CPU
 4890     1 /usr/lib/jvm/java-1.8.0-ope 38.1  1.0
23204     1 /usr/sbin/mysqld --daemoniz  7.1  0.9
26056  3484 node /home/ec2-user/tools/j  1.3  111
 3548  3484 node /home/ec2-user/tools/j  1.1  0.3
 3484     1 PM2 v3.5.0: God Daemon (/ro  0.7  0.6
26067 26056 /root/.nvm/versions/node/v1  0.3  7.5
26074 26067 /root/.nvm/versions/node/v1  0.3  7.5
 3610  3548 /root/.nvm/versions/node/v1  0.3  0.0
 3624  3610 /root/.nvm/versions/node/v1  0.3  0.0

共有1个答案

庄宇
2023-03-14

@vlumi等人试图把我引向“没有直接内存可用”的正确方向。尽管如此,我还开始遇到“堆内存不足”“内存不足”的其他问题。

问题是:在tomcat服务器上重新部署WAR之后,现有的线程没有被杀死,它们的引用仍然存在,因此GC无法清理它。最初的metaspace(早期称为PermGen)有80MB,随着应用程序的启动,这个数字增加到了125。一旦重新部署,intead返回到80MB,VisualVM探查器上的metaspace显示为170MB,在下一次重新部署中显示为210。这清楚地表明,在再进行十几次重新部署(这是一个测试服务器)之后,JVM将耗尽用于分配的RAM空间,并抛出堆内存。

为了解决这个问题,我们在Jenkins作业中添加了一个tomcat7:shutdown(或通过shell脚本重新启动)。停止和启动tomcat可以像以前一样默认返回元aspaces。其他一些人试图杀死jawa进程,以便杀死所有线程。

 类似资料:
  • 对此有什么建议吗?

  • 我一直在使用G1垃圾收集器经历Java VM崩溃。我们得到使用以下签名生成的hs_err_pid.log文件:

  • 问题内容: 我刚从python移植了我的应用程序,所以Go有点新。看来我遇到了记忆问题。 它在ubuntu机器上运行。通过主管。 编辑: 设置解决问题 问题答案: 对于遇到此问题的其他人,这是golang问题中的相关近期问题 对于所有受影响的人,在Linux上得到适当修复之前的临时替代方法可以是以下之一: 启用无条件过量使用: 能够无条件过载:添加交换到你的主机,用它几乎永远不会被使用,但在计算参

  • 问题内容: 我有一个Python脚本,它每60秒执行一次,作为后台进程运行。其中一部分是对subprocess.Popen的调用,以获取ps的输出。 运行几天后,该呼叫出现以下错误: 但是,服务器上free的输出为: 我到处寻找问题,发现这篇文章说: 解决方案是向服务器添加更多交换空间。当内核分叉启动建模器或发现过程时,它首先确保在交换存储中有足够的空间来存储新过程(如果需要)。 我注意到上面的免

  • 我正在AWS(Ubunut)EC2实例上运行一个脚本。它是一款网页刮板,使用Selenium/ChromeDriver和无头chrome来刮一些网页。我以前运行这个脚本没有任何问题,但是今天我遇到了一个错误。下面是脚本: 当我从ubuntu运行这个脚本时,我得到这个错误: 我确认我正在运行相同版本的ChromeDriver/Chromium浏览器:

  • 我的问题是,谁分配和管理这些内存段?操作系统不知道java程序正在运行,并认为它是JVM的一部分,作为计算机上的常规程序运行,JIT编译、java堆栈的使用,这些操作需要运行时内存分配,我不明白的是JVM如何将其内存划分为这些内存段。这肯定不是由操作系统来完成的,这些内存段(例如java堆栈)必须是连续的才能工作,所以如果JVM程序只是使用malloc命令来接收堆内存的最大大小并将这些内存划分为多

  • 我有一个非常消耗内存的程序,想使用-Xmx2048m为java jvm分配更多的最大内存。但在启动时,我得到一个“无法为对象堆保留足够的空间”错误。 当尝试多个值并发现我的最大值是时,它就开始了。但我喜欢分配2GB。在使用-Xmx1560m启动java进程后,我有6GB的物理内存,Taskmanager显示3400MB可用。 有人知道我为什么不能分配2GB吗?

  • 内存不足,Java运行时环境无法继续。 本机内存分配(mmap)无法映射1366294528字节以提交保留内存。包含更多信息的错误报告文件保存为://hs_err_pid5.log