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

3
我正在运行一个64位Amazon Linux 2016.09 v2.5.2,Tomcat 8 Java 8环境,使用AWS Elasticbeanstalk免费版(实例类型:t1.micro)。我有一些RESTful服务,当调用特定的服务时,会执行一些操作,我始终收到502错误,并在日志中看到以下内容:

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000e2220000, 130215936, 0) failed; error='Cannot allocate memory' (errno=12)

There is insufficient memory for the Java Runtime Environment to continue. Native memory allocation (mmap) failed to map 130215936 bytes for committing reserved memory. An error report file with more information is saved as: /tmp/hs_err_pid31500.log OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=64m; support was removed in 8.0

问题: 这意味着我需要升级到付费版本,即大于实例类型t1.micro吗?
或者,我是否可以配置我的环境来处理这个问题?
我之所以问这个问题,是因为上面的日志表明Java应用程序仅需要130mb(130215936字节)的内存,而下面您可以看到JVM堆大小要大得多。因此,我不会期望它在130mb处崩溃。
更多信息:
我有以下配置设置:

enter image description here

谢谢

更新

我将 Max JVM 更改为 256mb,但仍然遇到错误:

OpenJDK 64位服务器 VM 警告:忽略选项 MaxPermSize=256m;在 8.0 中删除了支持 OpenJDK 64位服务器 VM 警告:INFO: os::commit_memory(0x00000000c0000000, 89456640, 0) 失败;error='Cannot allocate memory' (errno=12)

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

但这里仅使用了 89mb 就出现了问题。


1
你确定你的实例中有足够的内存来处理你所请求的堆大小吗?尝试将最大JVM堆大小更改为较小的值。 - muzzlator
请提供您的内存状态输出。使用top或htop等工具。 - Sam
我不确定在AWS环境中如何做到这一点。据我所知,我没有访问命令行的权限。或者我有吗? - Richard
1个回答

3
根据您的更新中的错误信息,似乎您尝试调整JVM永久代大小。请尝试将此设置保留为默认值。相反,将初始堆大小和最大堆大小都设置为64mb。
如果仍然崩溃,一旦崩溃,您可以通过ssh访问AWS实例并查看使用内存的内容。在beanstalk中,在环境的配置下,“实例”下,您可以选择要与实例一起使用的密钥对。您可以在EC2控制台中找到由beanstalk启动的实例,就像其他任何实例一样。

谢谢。我知道导致崩溃的代码。我正在进行一些“单词块”处理,以从句子中提取名词。它在我的本地主机上运行良好,但在AWS Elastic Beanstalk上失败了。但令我惊讶的是,根据日志文件报告,它没有使用太多内存(130mb)。我将设置初始和最大堆大小为64mb,看看会发生什么。 - Richard
将初始堆大小和最大堆大小调整为64mb后,我遇到了以下错误:java.lang.OutOfMemoryError: Java heap space。 - Richard
@Richard 好的,现在是你的Java进程用尽了内存。尝试逐步增加初始/最大内存。尝试128MB和256MB。如果你回到机器内存不足的状态,请登录实例并查看剩余内存使用情况。如果堆大小达到256MB后仍然出现Java OutOfMemoryError,则我认为您将无法使用t2.micro。 - Maxime
谢谢,是的,这就是我想要确定的,我需要升级我的AWS服务,还是可以在当前的“免费”(t1.micro)服务上运行它。你知道t1.micro服务器有多少可用内存吗?我在这里读到,它是0.613GB,所以不确定为什么它在130mb时会崩溃。http://www.ec2instances.info/ - Richard
在初始JVM堆大小为128m和最大JVM堆为256m的情况下,我遇到了ava.lang.OutOfMemoryError: Java heap space。 - Richard
显示剩余2条评论

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