java不能分配内存了怎么办,java.net.SocketException:无法分配内存(不是Mac)

我在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脚本,因此很可能会由此引起问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. Java根据MAC地址获取IP地址的方法: Java中可以使用InetAddress类来获取网络上的IP地址。但是,InetAddress类并没有提供直接的方法来获取MAC地址。在Java中获取MAC地址需要通过操作系统提供的API来实现。下面是一种获取MAC地址的方法: ```java import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; public class MacUtil { public static String getMacAddress(String ipAddress) throws UnknownHostException, SocketException { InetAddress inetAddress = InetAddress.getByName(ipAddress); NetworkInterface network = NetworkInterface.getByInetAddress(inetAddress); byte[] mac = network.getHardwareAddress(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < mac.length; i++) { sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "")); } return sb.toString(); } } ``` 2. Java根据本地IP获取MAC地址的方法: Java中同样可以使用InetAddress类来获取本地IP地址。获取本地MAC地址同样需要通过操作系统提供的API来实现。下面是一种获取本地MAC地址的方法: ```java import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; public class MacUtil { public static String getMacAddress() throws UnknownHostException, SocketException { InetAddress inetAddress = InetAddress.getLocalHost(); NetworkInterface network = NetworkInterface.getByInetAddress(inetAddress); byte[] mac = network.getHardwareAddress(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < mac.length; i++) { sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "")); } return sb.toString(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值