AWS:Java 运行时环境内存不足,无法继续

Posted

技术标签:

【中文标题】AWS:Java 运行时环境内存不足,无法继续【英文标题】:AWS: There is insufficient memory for the Java Runtime Environment to continue 【发布时间】:2017-08-13 20:16:54 【问题描述】:

我在AWS Elasticbeanstalk 免费套餐上运行64bit Amazon Linux 2016.09 v2.5.2 running Tomcat 8 Java 8 环境(实例类型:t1.micro)。

我有许多 RESTful 服务,当一个特定的服务被调用时,它会做一些工作,我总是得到一个 502 error,并在日志中显示以下内容:

OpenJDK 64 位服务器虚拟机警告:信息: os::commit_memory(0x00000000e2220000, 130215936, 0) 失败; error='无法分配内存' (errno=12)

Java 运行时环境的内存不足,无法继续。 本机内存分配 (mmap) 未能映射 130215936 字节以提交保留内存。 包含更多信息的错误报告文件保存为: /tmp/hs_err_pid31500.log OpenJDK 64 位服务器 VM 警告:忽略选项 MaxPermSize=64m; 8.0 中移除了支持

问题

这是否意味着我需要升级到付费版本,即大于实例类型:t1.micro

或者,有没有办法可以配置我的环境来处理这个问题?

我问的原因是因为上面的日志表明 Java 应用程序只需要 130mb (130215936 bytes) 内存,而在下面你可以看到 JVM heap 的大小要大得多。所以我没想到它会在130mb 处倒下。

更多信息

我确实有以下配置设置:

谢谢

更新

我把Max JVM改成256mb,还是报错:

OpenJDK 64 位服务器 VM 警告:忽略选项 MaxPermSize=256m; 在 8.0 OpenJDK 64 位服务器 VM 警告中删除了支持:信息: os::commit_memory(0x00000000c0000000, 89456640, 0) 失败; error='无法分配内存' (errno=12)

Java 运行时环境的内存不足,无法继续。 本机内存分配 (mmap) 未能映射 89456640 字节以提交保留内存。 包含更多信息的错误报告文件保存为: /tmp/hs_err_pid14014.log OpenJDK 64 位服务器 VM 警告:忽略选项 MaxPermSize=256m; 8.0 中移除了支持

但在这里它只落在89mb上。

【问题讨论】:

您确定您的实例中有足够的内存来处理您请求的堆大小吗?尝试将最大 jvm 堆大小更改为更小的值 给我们你的记忆统计的输出。使用 top 或 htop 等。 我不确定如何在 AWS 环境中执行此操作。据我所知,我无法访问命令行。还是我? 【参考方案1】:

根据您更新中的错误消息,您似乎试图调整 JVM 永久代大小。尝试将此设置保留为默认值。相反,将初始堆大小和最大堆大小都设置为 64mb。

如果它仍然崩溃,一旦它崩溃,你可以 ssh 到 AWS 实例并查看内存在使用什么。在 beanstalk 中,在您的环境配置中,在“Instances”下,您可以选择要与您的实例一起使用的密钥对。您可以在 EC2 控制台中找到 beanstalk 启动的实例,就像任何其他实例一样。

【讨论】:

谢谢。我知道导致崩溃的代码。我正在做一些单词分块以从句子中取出名词。它在我的本地主机上运行良好,但在 AWS Elastic Beanstalk 上运行良好。但令我惊讶的是,它没有使用日志文件中报告的太多内存(130mb)。我将初始和最大堆大小设置为 64mb,看看会发生什么。 将初始和最大堆大小调整为 64mb 后,我得到:java.lang.OutOfMemoryError: Java heap space @Richard 好的,所以现在是您的 java 进程内存不足。尝试逐步增加您的初始/最大内存。试试 128mb 和 256mb。如果您回到让机器内存不足的情况,请登录到实例并查看剩余内存的使用情况。如果一旦达到 256mb 堆大小你仍然得到 java OutOfMemoryError,那么我认为你将无法使用 t2.micro。 谢谢,是的,这就是我想要建立的,我是否需要升级我的 AWS 服务,或者我可以让它在我当前的“免费”(t1.micro) 服务上运行。你知道 t1.micro 服务器有多少内存可用吗?我在这里读到,它是 0.613GB,所以不知道为什么它会以 130mb 下降。 ec2instances.info 初始 JVM 堆大小为 128m,最大 JVM 堆为 256m,我得到 ava.lang.OutOfMemoryError: Java heap space。

以上是关于AWS:Java 运行时环境内存不足,无法继续的主要内容,如果未能解决你的问题,请参考以下文章

“Java运行时环境没有足够的内存继续” - maven build - Intelllij [重复]

JAVA运行时显示 程序内存不足,该如何调整

JAVA软件运行时,内存不足

无法执行脚本:内存不足,无法继续执行程序

内存不足,无法继续执行程序

AWS Glue 作业内存不足