Java JVM崩溃,错误=';无法分配内存';(errno=12)即使内存可用
我遇到JVM无法在Java中分配内存的问题 OpenJDK 64位服务器虚拟机警告:信息: os::提交_内存(0x0000000734880000,880279552,0)失败; 错误=“无法分配内存”(errno=12) 内存不足,Java运行时环境无法运行 继续。本机内存分配(mmap)映射880279552失败 用于提交保留内存的字节。包含更多信息的错误报告文件 信息另存为: /home/ec2 user/tools/apache/apache-tomcat-9.0.6/bin/hs_err_pid23366.log java.lang.NullPointerException 这是我的记忆统计数据Java JVM崩溃,错误=';无法分配内存';(errno=12)即使内存可用,java,Java,我遇到JVM无法在Java中分配内存的问题 OpenJDK 64位服务器虚拟机警告:信息: os::提交_内存(0x0000000734880000,880279552,0)失败; 错误=“无法分配内存”(errno=12) 内存不足,Java运行时环境无法运行 继续。本机内存分配(mmap)映射880279552失败 用于提交保留内存的字节。包含更多信息的错误报告文件 信息另存为: /home/ec2 user/tools/apache/apache-tomcat-9.0.6/bin/hs_e
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堆外内存问题。最接近这个问题的是
然而不同之处在于,在链接线程中,用户的可用空间较少,JVM试图分配更高的内存(打开和关闭)
在我的例子中,JVM试图分配880279552个BTE(0.8 GB),而我的可用内存(上面)是3.7 GB。JVM虽然有将近4倍的可用内存,但却无法分配它,这是什么原因呢?一个附带问题:它为什么要分配0.8GB内存。这正常吗?有没有办法通过工具更深入地了解此类分配?有人能指出一个资源来更好地理解上面的内存统计信息吗
这是我在setenv.sh中的JVM配置(它是一台8GB RAM机器)
崩溃后,这里是最消耗内存的服务,在java消耗了3.1GB之后,MySQL使用了0.5GB(再次确认第一个内存统计屏幕截图,显示4GB内存可用)
非常感谢您对我的帮助。@vlumi和其他人试图引导我走向“没有直接内存可用”的正确方向。尽管如此,我还开始遇到“堆外内存”、“内存不足”等其他问题 问题如下:在tomcat服务器上重新部署WAR后,现有线程没有被杀死,它们的引用仍然存在,因此GC无法清理它。最初的元空间(以前称为PermGen)有80MB,随着应用程序的运行,这个空间增加到125 MB。一旦重新部署,在返回80MB之前,VisualVM分析器上的元空间显示为170MB,在下一次重新部署中显示为210。这清楚地表明,在另外十几次重新部署(这是一个测试服务器)之后,JVM将耗尽用于分配的RAM空间,并抛出一个堆内存 为了解决这个问题,我们在Jenkins作业中添加了tomcat7:shutdown(或通过shell脚本重新启动)。停止和启动tomcat可以像以前一样默认回到元空间。其他一些人试图杀死jawa进程,以便杀死所有线程
谢谢大家的贡献。这是最有助于了解真实情况的网站的第一步 也许这有帮助:不,没有。您共享的线程仅解释xms和xmx。我之前遇到了一个堆问题,当时内存xmsxmx分别为1024和2048。这一次是2048年和4096年,比以前翻了一番!这里还有别的事情。潜在的问题是直接内存。将'-XX:MaxDirectMemorySize'作为选项是否有帮助?我还发现jmap和jstat是监视内存的有用工具usage@user2181576使用xmx,您将进程的可用堆内存限制为4GB,因此即使有更多的物理内存可用,它也不会使用更多内存。崩溃时,您的进程使用了多少内存?有接近堆极限的地方吗?谢谢vlumi。我的问题是,为什么Java不启动它的GC来满足我的需要,即获取上面图表分配给我堆的空闲内存?如果堆内存增加,它还可以清理旧的gen空间。
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