tomcat关闭报错:error='Cannot allocate memory' (errno=12)

最近在使用 tomcat 的时候,总是在shutdown出现error='Cannot allocate memory' (errno=12)错误。起初只当是偶然因素引起的,所以没有重视。可是后来发现每次都会出现这个错误,所以这次决心找到原因解决。

第一步

首先观察报错信息如下:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000eaaa0000, 357957632, 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 357957632 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/gaea/tomcat-api/hs_err_pid14638.log

看#里面的内容,主要表达:Java 运行所需内存不足,本地内存分配为提交保留的内存分配失败。看到这里,突然想到之前在 catalinn.sh 中更改过虚拟机的启动参数,如下:

JAVA_OPTS="-Xms512m -Xmx1024m -Xss1024K"

第二步

分析错误信息:

  • 众所周知,-Xms 表示堆的大小,-Xmx 表示堆的最大值。当 Java 虚拟机的堆内存不够时,就会向操作系统请求保留的堆内存,即堆的最大值与当前堆大小的差值。这样设置的目的是为了让虚拟机有更好性能收缩弹性,但是在这里适得其反了,因为当前 tomcat 运行的主机内存为 2GB。除了tomcat 之外,系统中还运行着其他服务,这就导致在 Java 虚拟机向操作系统请求分配保留的堆内存时,系统无法分配。
  • 这里就引出了第二个问题,为什么只是shutdown的时候才出现报错,而 tomcat 没有宕掉。这是因为在shutdown时,需要单独一个进程来运行关闭tomcat时的一些操作,所以需要更多的内存,恰恰这些需要分配的内存超过了本地内存的上限,导致分配失败。所谓『压死骆驼的最后一根稻草』。

第三步

既然知道了问题的原因,解决起来就比较方便了,直接在 catalina.sh 中将虚拟机启动参数修改如下:

JAVA_OPTS="-Xms512m -Xmx512m -Xss1024K"

这样就解决问题了。

思考

通过上诉问题的解决,可以得出结论:

  • 不要在内存吃紧的情况下,采用 -Xmx的方式动态分配堆内存。

版权声明:本文为博主原创文章,未经博主允许不得转载。
https://www.jianshu.com/p/08ca8dc4b5f0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,731评论 11 349
  • Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒...
    愤怒的_菜鸟阅读 2,182评论 0 24
  • Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒...
    java面试收割机阅读 1,237评论 0 8
  • 十一、离别 分手之时,薛涛带着所有的幻想,写了一首《赠远》“知君未转秦关骑,日照千门掩袖啼。闺阁不知戎马事,月...
    香水春天阅读 333评论 0 0
  • 《长崎的俳句与巴洛克》(又名:“荒城之月”) 有人说长崎疯长着早慧的双瞳 所以他能把一团飞絮看成仙翁 还有人说长崎...
    梅溪仙子阅读 315评论 0 0

友情链接更多精彩内容