java.net.SocketException : Cannot allocate memory (not Mac) 异常

标签 java tomcat ubuntu

我在运行 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 作为问题的可能来源,但不幸的是我没有太注意它。当我得到另一个受问题影响的硬件盒时,我尝试绑定(bind)非特权端口并成功,而尝试绑定(bind)特权端口导致异常。所以,最终我用 iptables 替换了 authbind。

基本上,fady taher 的回答指向 authbind,但 Danny Thomas 的回答提供了关于 fork 和“无法分配内存”之间联系的非常有趣的信息, 实际上我们也使用process builder来运行bash脚本,所以问题很有可能是由它引起的。

最佳答案

听起来您的物理内存或交换空间不足 - 在受影响的系统上,检查内存和交换空间。

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

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

关于java.net.SocketException : Cannot allocate memory (not Mac) 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17853571/

相关文章:

java - ViewPager/PagerAdapter导入资源的问题

java - 尝试调用 SQLite 驱动程序时不断获取 "IOException: Access Denied"

java - 在 Apache Tomcat 服务器 7.0 中部署 PHP 和 Java EE 应用程序

perl - 如何将我的 Catalyst 应用程序部署为 debian 包(或合适的替代方案)?

r - Debian/Ubuntu r-base-*、r-cran-*、revolution-r 软件包 : porting to ArchLinux

r - 在 Ubuntu 12 上安装最新版本的 R?

java - 如何在 java 中重置 FileReader 而无需大幅更改我的程序?

java - 使用split()时悬挂元字符

java - 用于 Java Swing 应用程序的 UI 自动化工具,具有记录和回放以及屏幕捕获功能

jquery - Ajax JSONP Parseerror-Callback-Not-Called with Tomcat 9