加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java.net.SocketException:无法分配内存(不是Mac)

发布时间:2020-12-15 00:37:30 所属栏目:Java 来源:网络整理
导读:我在ubuntu 10.04上运行的tomcat 7上部署了一个 java应用程序.在打开服务器套接字时遇到了一个问题,到目前为止我无法重现: java.net.SocketException: Cannot allocate memoryat java.net.PlainSocketImpl.socketBind(Native Method)at java.net.AbstractPl
我在ubuntu 10.04上运行的tomcat 7上部署了一个 java应用程序.在打开服务器套接字时遇到了一个问题,到目前为止我无法重现:
java.net.SocketException: Cannot allocate memory
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at org.subethamail.smtp.server.SMTPServer.createServerSocket(SMTPServer.java:338)
at org.subethamail.smtp.server.SMTPServer.start(SMTPServer.java:291)

所有我能够发现的是,这种情况发生在MacOS的某些特定版本上,这与我无关,也与OpenJDK无关,这也与我无关(我使用的是Oracle JRE 1.7.0_17).另一个可能的原因是虚拟化环境,但在我的情况下,这发生在硬件盒上.

所以,问题是,是否有人遇到过同样的问题以及可能的解决方案.

更新
还有这样的事情:tomcat消耗了几乎所有的堆,大约700mb,这是由我的代码中的内存泄漏引起的.
但据我所知,该异常讲述了系统级别的套接字缓冲区,因此它似乎与java堆无关.然而,这是我到目前为止唯一的解释,在我看来这是非常虚幻的.

更新2
最终我们已经能够多次重现这个问题,所以这不是关于内存泄漏的问题.当我第一次面对问题时,我正在考虑将authbind作为问题的可能来源,但不幸的是我没有太多关注它.当我得到另一个受此问题影响的硬件盒时,我尝试绑定非priveleged端口并成功,而尝试绑定priveleged端口会导致异常.所以,最终我用iptables替换了authbind.

基本上,fady taher的答案指向authbind,但Danny Thomas的答案提供了关于分叉和“无法分配记忆”之间关系的非常有趣的信息,
实际上我们还使用流程构建器来运行bash脚本,因此很可能会由此引起问题.

解决方法

听起来你没有足够的物理内存或交换 – 在受影响的系统上,检查内存和交换.

您的应用程序是否恰好执行外部命令 – fork / exec可能有所贡献.您可以考虑允许内存过量使用,如果是这种情况:

http://bryanmarty.com/blog/2012/01/14/forking-jvm/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读